7. 상속
- Constructor
* 객체지향의 특징중 하나인 '객체는 서로 다른 상태를 가지고 있다'는 Constructor라는 Method에
접목된다.
* 처음부터 설정된 값으로 똑같은 Instance들을 생성하고 각자만의 특징을 갖게 만든다면,
일일이 Instance의 속성을 바꿔야하기 때문에
코드의 효율성이 떨어지는 것은 물론 객체지향에 어긋난다.
* 그러므로 처음에 Instance를 생성할 때,
Constructor를 통하여 각자만의 상태로 Instance를 초기화 함으로서,
* '객체는 서로 다른 상태를 가지고 있다'라는 특징을 보여주고 있다.
* Constructor는 메모리에 Class를 적재하는 역할을 하고 있다.
- super, this, super(), this()
* super, super()는 상위에 있는 같은 Signature의 속성과 행위를 호출한다.
(특정 Signature를 가진 상위 Class에 Method를 호출할 때, 그 Method가 존재하지 아니하면
Compile 오류가 발생된다.)
* this, this()는 동위에 있는 같은 Signature의 속성과 행위를 호출한다.
* 상속성 특징 중 하나는 '상위 Class에 있는 속성과 행위는 하위와 공유를 한다.' 이다.
* 공유라는 키워드를 관점을 기반으로 두면,super, this, super(), this()의 개념에 대한 이해를 잡을 수 있다.
* Instance가 생성 될 때,
생성자는 메모리에 Class를 적재함과 동시에 this와 super Keyword가 묵시적으로 참조된다.
* 여기서 괄호가 붙은 this()와 super()는 Class의 생성자를 호출한다.
super()는 Super Class에 있는 생성자를 호출하고, this()는 동위에 있는 생성자를 호출한다.
이 둘은 생성자에서 초기에 작성해야 된다.
* 또한 super() Method가 생략되고
this()메소드가 최상단에 작성되어 있으면 this() Method를 먼저 호출한다.
* super(), this() Method에 있는 Arguments에 따라 호출되므로 잘 참조 하도록 한다.
(주의할 점은 동일한 Argument로 호출하면, 무한 재귀가 발생한다.)
* super, this Keyword는 Field와 Method를 호출할 때 사용된다.
* 생성자 호출과 마찬가지로 super는
상위의 Method나 Field를, this는 동위의 Method나 Field를 호출한다.
* this Keyword를 사용하면 사용자는 모든 객체들의 식별성과 코딩의 가독성을 준수할 수 있다.
-> 변수의 명칭
* Instance variable == Global variable == Field == Data
* Local variable
=> 변수는 Brace{}에 의존적
* 주의할 점
특히 Sub Class의 생성자에서 super() Method는 생략이 가능하며,
생략 될 경우 묵시적으로 Super Class의 Default Constructor를 호출한다.
- 취약점 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | // Sports.java public class Sports { public Sports(){ System.out.println("Sports"); } } // BaseBasll.java public class BaseBall extends Sports { public BaseBall(String name){ super(); System.out.println(name + "ㅋㅋㅋ"); } } // BugsTeam.java public class BugsTeam extends BaseBall { public BugsTeam(String name) { super(name); // 상위 클래스의 생성자나 메소드를 호출할 경우. // 시그니처에 맞는 것을 찾는다. 만약 존재하지 아니하면 // 컴파일러 에러가 발생한다. new BugsTeam("dj"); } } // Const.java public class Const { public static void main(String args[]){ new BugsTeam("zzz"); } } |
- 취약점 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | // Sports.java public class Sports { } // BaseBasll.java public class BaseBall extends Sports { public BaseBall(String name){ super(); // 위 경우는 오류가 발생하지 않는다. // 어떠한 생성자든 정의된것이 아무것도 없을땐 // 디폴트 생성자가 생성된다. // 따라서 오류가 발생하지 않는 이유는 // 상위클래스에서 묵시적으로 디폴트 생성자가 생성된다. System.out.println(name + "ㅋㅋㅋ"); } } // BugsTeam.java public class BugsTeam extends BaseBall { public BugsTeam(String name) { super(name); // 상위 클래스의 생성자나 메소드를 호출할 경우. // 시그니처에 맞는 것을 찾는다. 만약 존재하지 아니하면 // 컴파일러 에러가 발생한다. new BugsTeam("dj"); } } // Const.java public class Const { public static void main(String args[]){ new BugsTeam("zzz"); } } | cs |
'Java > Theory' 카테고리의 다른 글
[Java/Theory]09. Import (0) | 2016.05.30 |
---|---|
[Java/Theory]08. Package (0) | 2016.05.30 |
[Java/Theory]06. OOP (0) | 2016.05.30 |
[Java/Theory]05. Reference (0) | 2016.05.30 |
[Java/Theory]04. Operator, Condition, Array (0) | 2016.05.30 |