2013년 8월 21일 수요일

08.14 접근레벨 지정자(접근제한자) / 상속 / Override / Object 클래스

접근레벨 지정자


- 클래스,인터페이스, 멤버에 대한 접근 영역을 제한 하기위해 사용

  1. class 레벨
    1. public (ex-public enum / public class)
      1. 패키지 밖에서 접근가능
    2. package-private(default)
      1. 패키지 안에서만 접근가능
  2. 멤버 레벨 (클래스 또는 인터페이스 내의 멤버에 대한 접근영역 제한)
    1. public - 어디서든 접근
    2. protected - 패키지내, 패키지외에서는 상속관계인 경우만 접근가능
    3. package-private(default) - 해당패키지 내에서만 접근
    4. private - 멤버가 선언된 클래스 내에서만 접근
                영역 - 패키지내, 패키지외, 멤버선언클래스, 상속관계클래스
                (빨간색- 접근불가) 

1.같은패키지 같은클래스
   all OK
2.같은패키지내(좌측하단)
   같은 패키지지만 private 변수엔 접근불가.(상속을 했는데도)
3.다른패키지 
   public만 접근가능
4.다른패키지 but 상속받은클래스
   public,protected →OK
   default,private → 접근불가

  • 관계
    • 사용관계 - import
    • 상속관계 - extends

* 접근제한자
private - 해당 class 내에서만 접근가능
default - 접근제한자가 지정되지 않은경우.같은 package 내에서만 접근가능
protected - 같은 package 접근가능/다른package서는 자식class에서만 접근가능
public - 어디서든 접근가능.
-----------------------------------------------------------------

상속

- 클래스를 다른 클래스로부터 파생하는것
- 클래스의 코드(필드와 메서드)를 재사용

수퍼클래스 → 서브클래스
Base클래스 → Extented클래스
부모클래스 → 자식클래스

- 자식클래스는 부모클래스로부터

  1. 모든 public,protected멤버 상속(생성자 제외)
    1. 같은 패키지내, 혹은 상속관계에 있는경우
  2. 같은 패키지에 있으면
    1.  package-private( = default) 멤버 상속

서브클래스 정의

- extends키워드와 부모클래스명을 사용
- 상속받은 멤버를 사용, 숨기거나, 대체가능
형식) [지시어]class 클래스명 extends 슈퍼클래스명 {
            ...
         }

상속받은 필드와 메서드 사용

상속받은 필드와 메서드를 사용
class Person {
  private String name;
  int age;
   public void setName(String name) {
      this.name;
   }
   public void getName() {
      return name;
   }
}

class Student extens Person {

   public void print() {
      System.out.println(getName());//부모의 메서드 사용.
      System.out.println(age); //부모의 age사용.
   }
}


서브클래스 정의2

- 서브클래스에서는 (아래 1~5)
  1. 새로운 이름의 필드와 메서드 추가
    1. class Person {
        private String name;
        int age;
         public void setName(String name) {
            this.name;
         }
         public void getName() {
            return name;
         }
      }
      class Student extens Person {
         Sting sid;//학번 추가
         //setter 추가
         public void setSid(String sid) {
            this.sid = sid;
         }
      }
  2. 동일한 이름의 필드 선언.재정의(숨기기)
    1. class A {
    2.    int n = 10;
    3. }
    4. class B extends A {
    5.    int n=20; //동일한 이름으로 변수 선언
    6.    public void print() {
    7.       System.out.println(n);
    8.    }
    9. }
    10. new B.print(); //20
    11. System.out.println(new B().n);//20 자식클래스에선 부모필드는 숨겨진다.
  3. 동일한 이름의 static메서드 재정의(숨기기)
    1. class A{
    2.    static int a=1;
    3.    public static void printStatic() {
    4.       System.out.println("A:"+a);
    5.    }
    6. }
    7. class B extends A {
    8.    static int a=2;
    9.    public static void printStatic() { //동일한 이름으로 static메서드 선언
    10.       System.out.println("B:"+a);
    11.    }
    12. }
    13. B.printStatic();//B:2
  4. 동일한 이름의 instatce 메서드 재정의(override) => 자식을 통한 부모메서드 접근X
    1. class Person {
    2.    public void sayHi() {
    3.        System.out.print("안녕하셈");
    4.    }
    5. }
    6. class Student extends Person{ 
    7.    public void sayHi(){ //override
    8.       System.out.println("안녕~");
    9.    }
    10. }
    11. new Student().sayHi(); //안녕~
  5. super()를 이용한 생성자.(-- 부모로부터 상속받은 생성자 초기화에 사용)
    1. class Person {
    2.    String name;
    3.    int age;
    4.    Person(String name,int age) {//생성자
    5.        this.name=name;
    6.        this.age = age;
    7.    }
    8. }
    9. class Student extends Person{ 
    10.    int sid;
    11.    int age = 20; //부모와 동일한 변수 선언.
    12.    Student(String name,int age,int sid) {//생성자
    13.        super(); //super() 생성자
    14.        this.sid = sid;
    15.    }
    16.    public void print() {
    17.       System.out.print(this.age+","+super.age);  //super reference
    18.       // 자식age , 부모age 출력
    19.    }
    20. }

@@ 실습 p203

서브클래스 정의3

- private 멤버에 대한 간접 access만 가능.(getter)

  1. 이 멤버에 접근하는 public or protected 메서드들을 통하여
  2. 상속받은 nested class를 통하여(클래스내 클래스-중첩클래스)

Override

- 서브클래스에서 슈퍼클래스의 메서드를 재정의 하여 사용하는 방법
- 조건: (접근레벨지시자/Exception은 제외하고 상속)

  1. 상속관계
  2. 메서드 이름이 동일
  3. 메서드 인자 리스트가 동일
  4. 메서드 리턴타입이 동일
  5. - 접근 지정자는 확대만 가능
  6. - 더 많은 예외를 가질 수 없음.(동일하거나 더 적은 예외)

- static,final,private 지정자를 가진 메서드는 오버라이드 할 수 없다.
   (cf - static 메서드는 숨기기만 가능. 나머지는 다 안됨.)


Overriding 와 Overrloading 비교

  1. 오버라이딩 :
    1.  상속관계에서, 상속받은 메서드의 내용을 재정의 하는것.
  2. 오버로딩 :
    1.  같은 클래스내에서, 새로운 메서드(매개변수의 타입,갯수,순서가 다른)를 만드는 것.
@@ 실습 p188~


super()

- 슈퍼클래스의 생성자를 호출할 때 사용
- 슈퍼클래스 멤버의 생성과 초기화 작업이 수행되어야 하기 때문
- 생성자의 첫줄에서 super()를 호출해야. 그렇지 않은 경우, 컴파일러가 자동으로 super()를 추가함.
    ==> 부모클래스에 기본생성자가 없다면 super() 에러..
- 매개변수가 있는 super 생성자를 사용하는 경우, 컴파일러는 기본 super()생성자를 추가하지 않음.

   * 부모클래스의 생성자가 호출되어야

상속

subclass의 객체의 생성과 형변한

- new키워드를 이용한 생성
- 객체의 형변환과 상속을 이용하여 reference를 부모클래스 타입의 참조변수에 저장할 수 있음.
예) Person p = new Student();//자동형변환    (Up-casting)
     Student s = (Student)p;     //명시적 형변환(Down-casting)
*부모클래스 객체를 자식클래스로 형변환=> 대개 실행시에러(why? 자식은 확장되어 있거든)

instanceof - reference를 특정타입으로 캐스팅 할수있는지 판단해주는 연산자
   - 예: 참조변수 instanceof 캐스팅할 타입
Person person1 = president1;
if(person1 instanceof President){
President president2 = (President)person1;
System.out.println("person1 을 President 타입으로 캐스팅 성공");
}

다형성 (Polymorphism)

- 하나의 interface를 사용해서 여러 데이터 타입을 다룰 수 있는 능력
- 상속 ,override를 이용해서 다형성 제공
예) Person p = new Student(); //부모형 자식객체 생성
     p.sayHi();//안녕~,override되었음 ==> 타입 폴리머피즘. 자식의 메서드 실행
     (Student)p.sayHi();//안녕~

- 파라미터의 다형성1
-         Person
-      ↙          ↘
- Student , Employee

class Person {
   public void test() {
       System.out.print("안녕하셈");
   }
}
class Student extends Person{
   public void test(){ //override
      System.out.println("안녕~");
   }
}
class Employee extends Person{
   public void test(){ //override
      System.out.println("안녕하십니까!");
   }
}

- 파라미터의 다형성2
class MikeTest{
   public void test(Person p) {
      p.sayHi();
   }
   public static void main(String args[])  {
      MikeTest mike = new Test();
      //Person 이 Student , Employee 등 여러개의 데이터형을 다룰수 있다=> 다형성
      mike.test(new Student()); //안녕~
      mike.test(new Employee()); //안녕하십니까!
   }
}

상속 - 배열의 다형성

class TestArray{
   public static void main(String args[]) {
      Person[] p = new Person[2];

      p[0] = new Student();
      p[1] = new Employee();

      for(int i=0;i<p.length;ㅑ++) {
           p[i].sayHi(); //안녕~,안녕하십니까! : 자식메서드 실행
      }
   }
}
@@ 실습 p215


Object 클래스

- java.lang 패키지의 Object클래스는 class hierarchy tree의 최상단에 위치함.
- 모든 클래스는 Object의 instance메서드(멤버)를 상속
  (notify,notifyAll,clone,equals,finalize,getClass,hashCode,toString)

final

- 더 이상 변경될 수 없다는 것을 선언한다.
- final 키워드가 사용가능한 곳 / 의미
  1. 필드 - 변경불가
  2. 메서드 - override 불가
  3. 클래스 - 상속불가.
@실습 p211,212

[문제1] 패키지
package외부에서 public package멤버를 사용하기위한 3가지 방법?
http://blog.daum.net/sweetheev/3346269
답) 

  1. import 패키기상세
  2. import 패키지.*
  3. fully qualified name 접근
[문제2] 접근제어자
접근범위가 넓은것에서 좁은 순서
public > protected > (default) > private

[문제3] 접근제어자 
1. 부모클래스의 private멤버는 접근할 수 있다. x
2. 같은 package내에서는, public과 protected멤버인 경우 접근가능하다. x
   - (default도 있다)
3. 다른 패키지의 클래스 상속인 경우는 default 멤버는 사용 할 수 없다. o
   - 디폴트는 같은 패키지 내에서만 접근가능.
4. public 메서드는 어디에서도 접근가능하다. o


[문제4]서브클래스의 메서드


3번째 x A:static B:인스턴스  허용불가
4번째 o .

[문제] override 조건으로 틀린것은? ( 4 )

  1. 이름이 같아야한다 o
  2. 매개변수의 수와 타입이 같아야 한다 o
  3. 리턴타입이 같아야 한다 o
  4. 접근제어자는 좁은 범위로만 변경할 수 있다 x
  5. 더 많은 예외를 선언할 수 없다. o

[문제] 형변환 바른것은? a, b


a- up casting : 자동형변환 되지만 - 형변환 연산자 붙여도 무관.
b- up casting : 자동형변환 
c- 확장된 자식에 부모객체를 대입하면, 확장된 내용을 사용불가.


[문제6] instanceof
결과가 ture가 아닌 것? 3 (형변환이 가능한 경우 - upcasting)

            A a=new A();
            B b=new B();
            C c=new C();

  1. c instanceof B //?
  2. b instanceof C //?
  3. a instanceof B //?
  4. b instanceof A //?
  5. c instanceof A //? 
UPCASTING 가능 -  2,4

3 - A의 객체 a를 B에 대입할수 있나? B는 확장됨 => 형변환불가
a instanceof C 도 마찬가지.


[문제7] 생성자
Student 클래스는 Person의 클래스를 상속받고 있다.
Student 의 생성자를 완성하기.

class Person {
 String name;
 int age;
 Person(String name, int age) {
  this.name = name;
  this.age = age;
 }
}

class Student extends Person
{
 int sid;
 Student(int sid,String name, int age) {
  //생성자 완성?
  super(name,age);
  this.sid = sid;
} }
[문제8] 상속과 다형성
override 해야될 메서드?

class SchoolNewsPaper {
public String getInfo(Object o) {
return (o==null)?null:o.toString();
}
...

}

sol) getInfo() 메서드-Student 클래스 객체 받을수 있어.
==> toString() 을 오버라이드 해야










댓글 없음:

댓글 쓰기