yoni

[28][OOP] 접근 한정자(Access Modifier, 제한자), Final 변수 본문

java of educational by contents

[28][OOP] 접근 한정자(Access Modifier, 제한자), Final 변수

yoni-1117 2018. 12. 9. 14:31

[01] 접근 한정자(Access Modifier, 제한자, 수정자) 
      - 다른 클래스에서 현재 클래스의 필드(변수)와 메소드(함수)의
        접근 가능 여부를 선언하는 기법, 일반적으로 변수(필드)는 private, 
        메소드는 public 을 선언합니다.
      - 2개 이상의 클래스에서의 관계입니다.   

1) 클래스간에 멤버 변수(필드)나 멤버 메소드(함수)에 접근하는 것을 제한할
   수 있습니다. 

2) 클래스간에 간섭을 막을 수 있음으로 콤포넌트의 독립성(캡슐화)을 강화할 수
   있습니다.
   . 간섭: A class를 변경하면 B class등 다른 클래스에서 심하게 에러가 발생하는 현상 
   . 필드 사용에 제한을 가할 수 있음. 

3) 자바의 객체 지향 문법을 구현하는 중요한 기술을 제공합니다.

4) 접근 제한자의 상세화(상속, 패키지, Call By Reference) 
   ------------------------------------------------------------------------------------------ 
   접근 제한자   클래스   같은 패키지   상속관계            관련없는 다른 패키지 
                     내부       (같은 폴더)   (폴더 상관 없음)   (다른 폴더) 
   ------------------------------------------------------------------------------------------
   public            ○              ○                ○              ○ (메소드(함수) 권장) 
   ------------------------------------------------------------------------------------------
   protected       ○              ○                ○               X  (JAVA API)  
   ------------------------------------------------------------------------------------------
   friendly          ○              ○                X                X  (생략시 기본, 비권장) 
   ------------------------------------------------------------------------------------------
   private           ○               X                 X               X  (필드(변수) 권장) 
   ------------------------------------------------------------------------------------------

5) 일반적으로 필드(변수, 데이터)는 private을 선언,  
   메소드(기능, 함수)는 public을 사용하면 OOP 구현에 크게 지장이 없음. 
 
 
3. 접근 한정자와 객체지향의 원리

1) 객체 지향 원리를 구현하지 않은 경우, 캡슐화 미지원, 필드 처리 로직 중복 발생



2) 객체 지향 원리를 구현한 경우, 캡슐화 지원, 필드 처리 로직 한번만 발생되어
    개발 및 유지보수 효율성 향상됨. 
    - 실행 메시지 전송: OOP에서 다른 객체의 메소드로 데이터를 전달하거나 메소드를
      실행하는 일, 비 OOP언어의 경우는 호출이라고합니다.


 
3. public 변수를 선언한 클래스를 만들고 값을 입출력하는 클래스를 작성하세요.
   - 권장되는 OOP 방식이 구현 안됨 


▷ Employee.java

- 값을 저장하기위한 변수 6개를 선언하세요. 

-----------------------------------------------------------------------------------
package oop4;
 
public class Employee {
  String name;
  int java;
  int web;
  int dbms;
  int tot;
  double avg;
 
}
 
 
 
-----------------------------------------------------------------------------------

 
▷ EmployeeUse.java

    - 평균에 + 0.5 처리를 통한 반올림 처리
      
[실행 화면]


성명: 아로미
JAVA: 90
WEB: 100
DBMS: 85
총점: 275
평균: 92
 
-----------------------------------------------------------------------------------
package oop4;
 
public class EmployeeUse {
 
  public static void main(String[] args) {
    Employee emp = new Employee();  // 객체 생성
    emp.name = "아로미";
    emp.java = 90;
    emp.web = 100;
    emp.dbms = 85;
    
    emp.tot = emp.java + emp.web + emp.dbms;
    emp.avg = (emp.tot / 3.0) + 0.5;
    
    System.out.println("성명: " + emp.name);
    System.out.println("JAVA: " + emp.java);
    System.out.println("WEB: " + emp.web);
    System.out.println("DBMS: " + emp.dbms);
    System.out.println("총점: " + emp.tot);
    System.out.println("평균: " + (int)emp.avg);
 
  }
 
}
 
 
-----------------------------------------------------------------------------------

    
▷ EmployeeUse2.java
    - 평균에 + 0.5 처리를 통한 반올림 처리

[실행 화면]


성명: 왕눈이
JAVA: 90
WEB: 100
DBMS: 85
총점: 275

평균: 92
     


-----------------------------------------------------------------------------------
package oop4;
 
public class EmployeeUse2 {
 
  public static void main(String[] args) {
    Employee emp = new Employee();  // 객체 생성
    emp.name = "왕눈이";
    emp.java = 90;
    emp.web = 100;
    emp.dbms = 85;
    
    emp.tot = emp.java + emp.web + emp.dbms;
    emp.avg = (emp.tot / 3.0) + 0.5;
    
    System.out.println("성명: " + emp.name);
    System.out.println("JAVA: " + emp.java);
    System.out.println("WEB: " + emp.web);
    System.out.println("DBMS: " + emp.dbms);
    System.out.println("총점: " + emp.tot);
    System.out.println("평균: " + (int)emp.avg);
 
  }
 
}
 
 
-----------------------------------------------------------------------------------
 
▷ EmployeeUse3.java
    - 평균에 + 0.5 처리를 통한 반올림 처리
      
[실행 화면]


성명: 투투
JAVA: 90
WEB: 100
DBMS: 85
총점: 275
평균: 92
-----------------------------------------------------------------------------------
package oop4;
 
public class EmployeeUse3 {
 
  public static void main(String[] args) {
    Employee emp = new Employee();  // 객체 생성
    emp.name = "투투";
    emp.java = 90;
    emp.web = 100;
    emp.dbms = 85;
    
    emp.tot = emp.java + emp.web + emp.dbms;
    emp.avg = (emp.tot / 3.0) + 10;
     
    if (emp.avg > 100) {
      emp.avg = 100;
    }
     
    System.out.println("성명: " + emp.name);
    System.out.println("JAVA: " + emp.java);
    System.out.println("WEB: " + emp.web);
    System.out.println("DBMS: " + emp.dbms);
    System.out.println("총점: " + emp.tot);
    System.out.println("평균: " + (int)emp.avg);
 
  }
 
}
 
 
-----------------------------------------------------------------------------------
 
  


 

  
  
4. private 변수를 선언한 클래스를 만들고 값을 입출력하는 클래스를 작성하세요.
  - OOP 구현
   - 평균에 + 0.5 처리를 통한 반올림 처리

[실행 화면]


성명: 왕눈이
JAVA: 68
WEB: 75
DBMS: 89
총점: 232
평균: 77
────────
성명: 아로미
JAVA: 90
WEB: 100
DBMS: 60
총점: 250
평균: 83
────────
...
 
 

1) 콤포넌트 구현
▷ Employee2.java
    ① 변수를 모두 private으로 선언합니다. 
    ② 기본 생성자를 선언합니다.
    ③ 'name, java, web, dbms' 필드에 값을 저장하는 생성자를 만듭니다.
    ④ 총점과 평균의 계산, calc() 메소드를 이용하여 필드를 처리합니다.
    ⑤ 출력, print() 메소드 이용


-----------------------------------------------------------------------------------
package oop4;
 
public class Employee2 {
  private String name;
  private int java;
  private int web;
  private int dbms;
  private int tot;
  private double avg;
 
  public Employee2() {
    
  }
 
  public Employee2(String name, int java, int web, int dbms) {
    this.name = name;
    this.java = java;
    this.web = web;
    this.dbms = dbms;
  }
  
  public void calc() {
    this.tot = this.java + this.web + this.dbms;
    this.avg = (this.tot / 3.0) + 0.5;
  }
  
  public void print() {
    System.out.println("성명: " + this.name);
    System.out.println("JAVA: " + this.java);
    System.out.println("WEB: " + this.web);
    System.out.println("DBMS: " + this.dbms);
    System.out.println("총점: " + this.tot);
    System.out.println("평균: " + (int)this.avg);
    System.out.println("────────");
  }
}
  
 
-----------------------------------------------------------------------------------
 
  

2) 콤포넌트 사용

▷ Employee2Use.java

-----------------------------------------------------------------------------------
package oop4;
 
public class Employee2Use {
 
  public static void main(String[] args) {
    Employee2 emp = new Employee2("왕눈이", 68, 75, 89);  // 객체 생성
    
    // 처리 로직 구현 권장하지 않음.
    // emp.name = "아로미"; // The field Employee2.name is not visible
    // emp.tot = emp.java + emp.web + emp.dbms;
    
    emp.calc(); // 처리 로직 구현
    
    // System.out.println("성명: " + emp.name);
    emp.print();
  }
 
}
  
 
 
-----------------------------------------------------------------------------------
 
 
▷ Employee2Use2.java

-----------------------------------------------------------------------------------
package oop4;
 
public class Employee2Use2 {
 
  public static void main(String[] args) {
    Employee2 emp = new Employee2("아로미", 90, 100, 60);  // 객체 생성
 
    // 처리 로직 구현 권장하지 않음.
    // emp.name = "아로미"; // The field Employee2.name is not visible
    // emp.tot = emp.java + emp.web + emp.dbms;
    
    emp.calc();
    
    emp.print();
  }
 
}
 
 
-----------------------------------------------------------------------------------
 
  
5. final 변수
   - null: 객체가 값을 할당받지 못한 경우의 표식, 메모리를 할당 받지 못한 경우. 
   - final(마지막): 상수의 종류이며 최초 할당된 값을 변경할 수 없습니다. 객체 생성 필요
   - final static: 상수, 변경되어서는 안되는 기본값, 객체 생성 안해도 접근 가능.

[실행 화면]

제목: 가을 단풍 여행 접수
제목: 서산 튜울립 축제
현재 인원: 1
여행사: (주)행복 여행사
연락처: ☎ 02-1111-1111
 
▷ FinalTest.java
-----------------------------------------------------------------------------------

package oop4;
 
class Final{
  // 1) 객체 생성해야 사용 가능, 값 변경 가능, 가장 많이 사용, instance 변수
  private String normal = "가을 단풍 여행 접수"; 
  
  // 2) 객체 생성 안해도 사용 가능, 값 변경 가능, 간편 사용, 변수 공유
  public static int COUNT = 0;   
  
  // 3) 객체 생성해야 사용 가능, 최초 값 변경 불가능, 상수 선언 
  public final String com = "(주)행복 여행사";
 
  // 4) 객체 생성 안해도 사용 가능, 최초 값 변경 불가능, 상수 선언, 변수 공유 목적
  // public static final String TEL = "☎ 02-1111-1111";  
  public final static String TEL = "☎ 02-1111-1111";
  
  // private 변수의 값 리턴
  public String getNormal(){
    return this.normal;
  }
  
  // private 변수에 값 저장
  public void setNormal(String normal) {
    this.normal = normal;
  }
}
 
public class FinalTest {
  public static void main(String[] args) {
    Final obj = new Final();
    
    // System.out.println("제목: " + obj.normal); // ERROR
    
    System.out.println("제목: " + obj.getNormal());   // 가을 단풍 여행 접수
    
    obj.setNormal("서산 튜울립 축제");
    System.out.println("제목: " + obj.getNormal());   // 서산 튜울립 축제
    
    Final.COUNT++;
    System.out.println("현재 인원: " + Final.COUNT);  // 1
    
    // obj.com = "(주)투어"; // The final field Final.com cannot be assigned
    System.out.println("여행사: " + obj.com);  // (주)행복 여행사
    System.out.println("연락처: " + Final.TEL); // ☎ 02-1111-1111
  }
 
}
 
  
 
-----------------------------------------------------------------------------------
 


Comments