Java/Theory

[Java/Theory]07. 상속

양승길 2016. 5. 30. 17:36

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");
    }
}
 

cs




- 취약점 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