본문 바로가기

Java

Java_09

* 상속

- 이미 작성되어진 클래스를 그대로 물려받고 필요부분을 수정해서 새로운 클래스로 만드는 것

 



- 클래스에서는 다중 상속이 지원 안된다
  · 두개이상은 안된다. 반드시 1개만 상속 가능하다
  · C언어는 된다 ;ㅅ;



* 접근제어자
  · private : 클래스내에서만 접근가능 (하위클래스도 접근불가)
  · protected : 동일패키지, 하위클래스에서 접근가능(하위클래스는 패키지가 달라도 접근가능)
  · public : 어디에서나 접근 가능
  · default (명시하지 않는 경우, friendly) : 동일 패키지만 접근가능(하위 클래스도 동일패키지가 아니면 접근 불가능)
  · 접근우선순위 : public > protected > default > private


* Override 

주석은 컴파일 하면 사라지지만 컴파일해도 사라지지 않는 메타정보
재정의를 뜻하며 이런 것을 다형성이라 한다.
부모 클래스 메소드를 사용하되 기존의 메소드에 수정사항이 필요하여 다시 정의 한다 보면 된다.
오버라이딩(Overriding)에는 반드시 상속관계가 있고, 접근제어는 크기가 같아야 하며 메소드원형, 이름,
인수는 같아야 한다.
@Override로 표기하며 생략해도 되지만 재정의라는 것을 알리기 위함으로 표시 된다.

ex)
class A_class {
         :
public void print() { }
}
class B_class extends A_class {
         :
public void print() { } // 재 정의(Overriding) : 상위 클래스의 메소드를 재정의
public int print(int a){ } // 중복 정의(상위 클래스의 메소드와는 무관)
public int print() { } // 오류
}


- 개념정리 *-(파일첨부)
 

[중간 소스 생략 Demo:super / Exam:sub]
class Exam extends Demo{.....
[중간 소스 생략]
Exam ob1=new Exam();  // 하위 클래스(Exam)안에 변수에 메모리를 할당하고 ob1에 대입

ob1.write();  // 부모클래스와 하위클래스 모두 갖고 있는 메소드: 하위클래스 값 우선
ob1.print();  // 부모클래스에만 있는 메소드: 부모클래스 값 우선
ob1.output();  // 하위클래스에만 있는 메소드: 하위클래스 값 우선
// 하위클래스에서 하위클래스 값만 호출할 때 변수를 부모클래스의 값으로 대입하여 부모클래스의 값을
// 넣을 수도 있다. ex) System.out.printf("sub output : %d %d %d %d\n", a,b,c,super.b);

System.out.print("ob1.b:"+ob1.b);  // 변수 접근
// b의 값은 부모에도 있는 값 : 하위클래스에도 초기화된 값이 있다면 하위클래스 값 우선

ob1.a=50;  // 자식은 부모의 protected값에 접근 가능 : a를 가리키고 있던 값은 부모클래스 뿐이었으므로
// 방은 1개 → a의 값 자체를 바꾸지만 주소값은 같다.
ob1.write();  // 위와 같이 하위클래스 값 우선이나 a의 값만 50으로 초기화 된 값 출력
ob1.print();  // 상동
ob1.output();  // 상동


- 개념정리 *-업캐스팅 : 부모클래스의 객체는 자식클래스의 객체를 가리킬 수 있다.
메소드 주소값만 가져오고 사용은 부모속성
업 캐스팅 시 캐스팅 소스 생략 가능

Demo ob2=ob1;  // Demo ob2=(Demo)ob1;
// ob1(하위클래스 Exam)의 값을 부모클래스인 Demo가 가리키며 ob2에 그 값을 저장
ob2.write();  // 둘다 있는 메소드: 자식의 메소드를 호출하지만 위에서 a의 값을 바꿨고 자식클래스에
// 가보니 b값도 200으로 초기화 되어 있고 c값은 자식 또한 부모의 값을 쓰고 있으므로 c의 값은 자신의 값
ob2.print();  // 부모클래스만 있는 메소드 : 위에서 바꾼 a값만 따르고 나머지는 부모자신의 값
// ob2.output(); // 자식만 있는 메소드 : 컴파일오류(상위클래스에서는 하위클래스의 멤버 접근불가)
System.out.println("ob2.b:"+ob2.b);  // 변수 접근
// 메소드와 다르게 super클래스의 멤버 접근. 하위클래스 멤버 접근이 불가여서...?


- 개념정리 *-다운캐스팅 : 업클래스 후 다시 원래의 값으로 돌아올 때 사용
반드시 캐스팅 소스를 붙여야 한다.

Exam ob3=(Exam)ob2; // 업캐스팅에서 (형)을 생략 가능했던 것과는 상반
// 자식클래스가 부모클래스를 가리키고 있는 ob2의 형변환을 한고 그것을 ob3에 대입
ob3.write(); // 둘다 있는 메소드 : 부모의 메소드ob2를 호출하지만 ob2는 ob1을 가리키고 있으므로
// 원래의 값인 자식클래스의 값이 되지만 a의 값은 위에서 재 초기화한 값50이 들어가고 b값도
// 재 초기화한 값200이 들어간다
ob3.print();  // 부모만 있는 메소드 : 위처럼 본래의 값으로..
ob3.output(); // 자식만 있는 메소드 : 상동
System.out.println("ob3.b:"+ob3.b);
// 원래의 b값 출력


- 개념정리 *-런타임 오류, 부모가 있다 해서 꼭 자식이 있는 법은 아니다. 메모리 할당 문제...

Demo dd=new Demo();
Exam ee=(Exam)dd;
  // 이부분은 아직도 좀 이해가 안감 @_ @a


* 인스턴스 변수(&메소드)와 클래스 변수(&메소드)의 접근(==호출?)

- 인스턴스 변수 호출 → 호출예가 뭐가 있을까요......ㅡ.ㅡa
  · 객체를 생성해야 접근가능 → ex) Test ob=new Test
  · heap메모리 할당
ex) public int a=10;

- 클래스 변수 호출 → System.out.println("b:"+Ex.b);
  · 언제든지 접근 가능
  · static메모리 할당(정점영역)
  · 클래스가 로딩되는 순간 메소드 영역에 메모리 확보(한번만)
  · 객체를 생성하지 않고 바로 접근하여 사용 가능
  · static이 들어간건 클래스변수
ex) public static int b=20;

- 인스턴스 메소드 호출 → ob=new Ex();  ob.write();
  · 객체를 생성해야 접근 가능
ex) public void write(){ }

- 클래스 메소드 호출 → Ex.print();
  · 객체를 생성하지 않아도 접근 가능
public static void print(){ }


* 용어 정리
- final
  · 메소드에 final이 붙으면 override(재정의)를 할 수 없다.
    ex) public final int a=10;  public final b;  public static final int c=20;

- final : 프로퍼티에서 final을 붙이면 단한번만 초기화가 가능하며 초기화 이후에는 값을 변경할 수 없다.

- super() : 부모클래스 생성자 호출, 실행문보다 먼저 위치해야 한다.
   인자가 있는 생성자 호출시 괄호안에 인자를 넣어주고 없을시 생략가능하다.

- extends : 부모클래스와의 상속을 맺는 키워드(하위클래스에서 사용)
   class 클래스이름 extends 상위클래스이름

- equals
  · Object equals 메소드는 주소 비교 : 이 메소드를 재정의 하여 사용할 수 있다.
                                               :
- instanceof 관계연산자
추후 내용 추가.. 현재 머리에 없음..

- static
추후 내용 추가.. 현재 머리에 없음..

- Singleton
추후 내용 추가.. 현재 머리에 없음..

- Object 클래스
이것도...= _ =

- GC 가비지컬렉터.. 

- 초기화 블럭..

- 비정형인자..

'Java' 카테고리의 다른 글

간단 용어 정리..  (0) 2011.12.19
문제...자바..  (0) 2011.11.06
Java_08  (0) 2011.11.02
Java_07  (0) 2011.11.01
Java_06  (0) 2011.10.31