abstract키워드?

추상 메서드(Abstract Method)를 간단하게 설명하면 "선언부는 있는데 구현부가 없는 메서드"를 말한다.

추상 클래스(Abstract Class)는 "추상 메서드가 하나라도 있는 클래스는 추상클래스로 선언해야 한다"를 말한다.


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
40
41
42
43
44
45
46
47
48
49
50
51
// Driver.java
package abstractMethod01;
 
public class Driver{
    public static void main(String[] args){
        동물[] 동물들 = new 동물[5];
        
        동물들[0= new 쥐();
        동물들[1= new 고양이();
        동물들[2= new 강아지();
        동물들[3= new 송아지();
        동물들[4= new 병아리();
        
        for(int i  = 0;i<동물들.length;i++){
            동물들[i].울어보세요();  
        }
    } 
}
 
// 쥐.java
package abstractMethod01;
public class 쥐 extends 동물{
    void 울어보세요(){
        System.out.println("찍!찍!");
    }  
}
 
// 고양이.java
package abstractMethod01;
public class 고양이 extends 동물{
    void 울어보세요(){
        System.out.println("야옹!");
    }  
}
 
// 병아리.java                           
package abstractMethod01;            
public class 병아리 extends 동물{        
    void 울어보세요(){               
        System.out.println("삐약");
    }                                
}
 
// 동물.java                                                               
package abstractMethod01;            
public class 동물{
    void 울어보세요(){               
        System.out.println("나는 동물 어떻게 울어야 하나요?");
    }                                
}
 
cs



동물타입의 참조 변수를 통해 하위 클래스의 인스턴스를 호출하고 있기 때문에 반드시 상위 클래스의

울어보세요()라는 메서드는 존재해야 한다. 

그런데, 동물클래스의 울어보세요()라는 메서드를 호출하게 되면 난감해진다.

동물이라는 객체를 울어보세요를 구현하기가 난감해진다. 


이럴 때 abstract 메서드를 사용하여 선언은 해놓되 구현부는 없는 형태로 구현한다.


1
2
3
4
5
// 동물.java
package abstractMethod01;
public abstract class 동물{
    abstract void 울어보세요();
}
cs


이렇게 되면 동물 클래스(최상위 추상 클래스)를 호출 할 때 에러가 난다. 

한마디로 추상클래스의 인스턴스 메서드를 호출하면 에러가 나므로 이러한 문제를 원천봉쇄 할 수 있다. 

- 추상클래스는 인스턴스, 즉 객체를 만들 수 없는 클래스가 된다.


- 추상클래스를 상속한 하위 클래스는 추상메서드의 구현부를 반드시 구현해야 한다.

그렇지 않은 경우에 "The type 고양이 must implement the inherited abstract method 동물.울어보세요()"라는 에러가 난다.


<<정리>>

- 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 즉, new를 사용 할 수 없다.

- 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. 오버라이딩 강제

- 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.


생성자란?

클래스의 인스턴스를 생성하는 메소드를 말한다.


클래스명 클래스참조변수 = new 클래스명();


생성자에 인자를 만들어도 되나?

된다. 

알아두어야 할 것이 있다.

- 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.

- 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.


static 블록이란?

클래스가 스태틱 영역에 배치될 때 실행되는 코드 블록이다.

클래스의 생성자와 같은 기능이다. 

여러 개의 객체를 생성 할 때는 당연히 처음 클래스가 불려질 때 띄워지는 부분이라고 보면 된다.

코드를 보면

1
2
3
4
5
6
7
package staticblock;
public class 동물{
    static 동물{
        System.out.println("동물 클래스 레디 온");  
    }
}
 
cs



그렇다면 메모리 구조를 설명 할 때보면 처음에 클래스가 가장 먼저 올라간다고 했으니까 스태틱 블록이

main메서드보다 먼저 호출될까?

=> 아니다.

실제로는 해당 패키지 또는 클래스가 처음으로 사용 될 때 로딩되는 것이 맞다.


static블록이 실행 될 때

- 클래스의 정적 속성을 사용할 때

- 클래스의 정적 메서드를 사용할 때

- 클래스의 인스턴스를 만들 때


왜 구조를 설명 할 때보면 자바 어플리케이션 실행 가장 맨 처음에 스태틱영역에 클래스들이 자리 잡는다고 했는데 그렇지 않은가?

스태틱영역도 메모리이기 때문이다. 메모리는 최대한 늦게 시작하여 최대한 빠르게 반환하는 것이 효율적이다.

물론 자바의 구조상 클래스와 패키지들은 스태틱영역에 자리잡은채 반환되지는 않는다. 

하지만, 최대한 늦게 로딩함으로써 메모리 사용을 최대한 늦추기 위해서 이와 같이 동작한다.



final키워드란?(클래스, 변수, 메소드에서)

클래스에 final 키워드가 붙으면 어떤 의미인가?

=> 상속을 허락하지 않는다는 의미이다.

1
2
3
4
5
// 클래스에서의 final 키워드
package finalclass;
 
public final class 고양이{}
 
cs



변수에 final 키워드가 붙으면 어떤 의미인가?

=> 바로 변경 불가능한 상수가 된다.

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
// 변수에서의 final 키워드
 
package finalValuable;
 
public class 고양이{
    final static int 정적상수1 = 1;
    final static int 정적상수2;
    
    final int 객체상수1 = 1;
    final int 객체상수2;
    
    static{
        정적상수2 = 2;
        
        // 상수는 한 번 초기화되면 값을 변경할 수 없다.
        // 정적상수2 = 4;  
    }
    
    고양이(){
        객체상수2 = 2;
        // 상수는 한 번 초기화하면 값을 변경 할 수 없다.
        // 객체상수  2 = 4;
        
        final int 지역상수1 = 1;
        final int 지역상수2;
        
        지역상수2 = 2// 최초 한 번만 가능  
    }
}
 
cs


최초에 값을 할당하지 않은 변수인 경우에 최초 1회만 값을 할당 가능하다.


메소드에 final키워드가 붙으면 어떤 의미인가?

=> 최종이라는 의미로, 재정의, 즉 오버라이딩이 금지된다.


instanceof 연산자란?

인스턴스는 클래스를 통해 만들어진 객체이다. 

instanceof연산자는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자이다.

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
// Driver.java
package instanceof01;
 
class 동물{
      
}
 
class 조류 extends 동물{
  
}
 
class 펭귄 extends 조류{
  
}
 
public class Driver{
    public static void main(String[] args){
        동물 동물객체 = new 동물();
        조류 조류객체 = new 조류();
        펭귄 펭귄객체 = new 펭귄();  
        
        System.out.println(동물객체 instanceof 동물); // true
        
        System.out.println(조류객체 instanceof 동물); // true
        System.out.println(조류객체 instanceof 조류); // true
        
        System.out.println(펭귄객체 instanceof 동물); // true
        System.out.println(펭귄객체 instanceof 조류); // true
        System.out.println(펭귄객체 instanceof 펭귄); // true
        
        System.out.println(펭귄객체 instanceof Object); // true
    }  
}
 
cs



- instanceof키워드는 실제 객체타입을 보고 판단한다.

- instanceof연산자는 클래스의 상속관계 뿐만 아니라 interface의 상속관계에서도 동일하게 적용된다.


package키워드란?

package키워드는 네임스페이스(이름공간)을 만들어주는 역할을 한다.

개발팀의 user클래스과 홍부팀의 user클래스는 분명 다르지만 같은 이름을 가진다. 

이러한 충돌을 막기 위하여 package키워드를 이용해  네임스페이스를 만들어주는 역할을 하는 것이다.


쉬운 예로)

A라는 사람의 스마트폰과 B라는 사람의 스마트폰은

스마트폰에는 동일하다. 하지만 A라는 사람과 B라는 사람의 이름이 다르기 때문에 

두 스마트폰을 구별할 수 있는 것이다.


interface키워드와 implements키워드 에서의 부가설명

앞써 설명했다. 접근제어지시자에 대해서 이야기하고자 한다.

- 인터페이스는 public 추상 메서드와 public 정적 상수만 가질 수 있다.

그렇다면 다음은 잘 못된 것인가?


1
2
3
4
5
6
interface Speakable{
double PI = 3.141592;
final double absoluteZeroPoint = -275.15;
 
void sayYes();
}
cs


=> 아니다. 배려깊게도 interface에 public과 abstract, static이라는 키워드를 사용하지 않아도 자동으로 그렇게 할당한다.

하지만 나는 이러한 특성을 알아도 반드시 명명해주겠다. 정확한 가독성이 중요하다고 생각하기 때문이다.


** 참고사항 **

자바 8에서의 변화 중 람다라는 것은 무엇인가?

좀 더 부가적인 설명이 필요하고 따로 정리해야겠지만, 

"람다는 변수에 저장 할 수 있는 로직이다."라고 설명 할 수 있다.

자바스크립트에서 변수에 함수를 저장하여 인자로 전달하거나 하는 기능을 사용 할 수 있었는데

자바에서도 이 같이 이해하면 될까?

다른 언어와 비교한다면

C++의 함수포인터!

C#의 델리게이트(Delegate)

자바스크립트 : 함수를 저장하는 변수 / 함수 인자로 callback 전달


this키워드?

- 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역변수가 우선된다.

- 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용한다.

- 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두사로 사용한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package This;
 
class 펭귄{
    int var = 10;
    
    void test(){
        int var = 20;
        System.out.println(var);      // 20출력
        System.out.println(this.var); // 10출력
    }  
}
 
public class Driver{
    public static void main(String[] args){
        펭귄 뽀로로 = new 펭귄();
        뽀로로.test();  
    }  
}
 
cs



super키워드?

단일 상속만을 지원하는 자바에서 super는

"바로 위 상위 클래스의 인스턴스를 지칭하는 키워드"이다. 

- super 키워드란 ? => "바로 위 상위 클래스의 인스턴스를 지칭하는 키워드"

- 하지만, 상위의 상위 클래스 super.super로는 접근 할 수 없다.

'JAVA' 카테고리의 다른 글

자바 해시맵(HashMap)  (0) 2015.08.05
자바 문자열  (0) 2015.07.26
자바와 객체지향  (0) 2015.06.30
자바 스레드의 이해  (0) 2015.06.30
자바 메모리 구조 >>> 2  (0) 2015.06.30
Posted by slender ankles
,