출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]

A instanceof B

참조변수 A

Type B

A가 B로 변환이 가능한가

True / False

 

 

  • 일종의 추상클래스, 추상클래스보다 추상화 정도가 높다
  • 실제로 구현된 것이 전혀 없는 기본 설계도
  • 추상메서드와 상수만을 멤버로 가질 수 있다
  • 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 작성
  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용된다.
  • 클래스처럼 상속 가능 / 다중상속 허용
  • Object클래스와 같은 최고 조상이 없다

 

예제1

 

예제2) 인터페이스 내에 선언된 변수는 무조건 public static final로 선언된다.

원래 case 1: case 2: - 같은 형식이었는데 좀 더 알아보기 쉽게 이렇게 바꿀 수도 있다.

 

예제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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package Oct17;
 
public class interfaceMark {
 
    public static void main(String[] args) {
 
        PointOne pos1 = new PointOne(11);
        PointTwo pos2 = new PointTwo(22);
        PointOne pos3 = new PointOne(33);
        PointTwo pos4 = new PointTwo(44);
        String test = "test";
        
        ClassPrinter.print(pos1);
        ClassPrinter.print(pos2);
        ClassPrinter.print(pos3);
        ClassPrinter.print(pos4);
        ClassPrinter.print(test);
    }
 
}
 
interface UpperCasePrintable {
    // 마킹하려고하는 건 거의 ~able로 이름을 만듦
 
}
 
class PointOne implements UpperCasePrintable {
    private int xPos;
    private int yPos;
 
    PointOne(int x, int y) {
        this.xPos = x;
        this.yPos = y;
 
    }
 
    @Override
    public String toString() {
        return "[x pos: " + xPos + ", y pos : " + yPos + "]";
    }
}
 
class PointTwo {
    private int xPos;
    private int yPos;
 
    PointTwo(int x, int y) {
        this.xPos = x;
        this.yPos = y;
    }
 
    @Override
    public String toString() {
        return "[x pos: " + xPos + ", y pos : " + yPos + "]";
    }
 
}
 
class ClassPrinter {
    public static void print(Object obj) {
        String str=obj.toString();
        
        // UppercasePrintable 형변환가능여부를 확인 > 대문자로 변경
        if(obj instanceof UpperCasePrintable) {
            str = str.toUpperCase();
        }
        
        System.out.println(str);
            
    }
}
cs

 

 

 

 

'JAVA > basic' 카테고리의 다른 글

예외처리 / Exception  (0) 2020.10.21
예외처리 / throw  (0) 2020.10.21
예외처리 / try-catch-finally  (0) 2020.10.21
추상클래스 / abstract class  (0) 2020.10.20
오버라이딩 Override / Overriding & 다형성  (0) 2020.10.16
상속 / extends  (0) 2020.10.15
[Singleton] 싱글톤 / 싱글턴 패턴  (0) 2020.10.15

 클래스가 설계도라면 추상클래스는 ‘미완성 설계도’ 

  • 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.  
  • 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다
  • 일반 메서드가 추상메서드를 호출할 수 있다 (호출 시 선언부 필요)
  •  

 

'JAVA > basic' 카테고리의 다른 글

예외처리 / throw  (0) 2020.10.21
예외처리 / try-catch-finally  (0) 2020.10.21
인터페이스 / interface / implements  (0) 2020.10.20
오버라이딩 Override / Overriding & 다형성  (0) 2020.10.16
상속 / extends  (0) 2020.10.15
[Singleton] 싱글톤 / 싱글턴 패턴  (0) 2020.10.15
getter / setter  (0) 2020.10.15

//출력

볼륨 크기 : 0
베이스의 크기 0

 

 

super 키워드를 넣으면 원래기능도 함께 할 수 있다.

 

@override 

주해(annotation)를 사용하면 컴파일러에게 수퍼 클래스의 메소드를 오버라이드 하려고 한다는 것을 알려줄 수 있다.

만약 컴파일러가 수퍼 클래스에 그러한 메소드가 존재하지 않는다는 것을 감지하면 오류를 알려준다

만약에 ShowCurrentState()라고 오타를 내면 오버라이딩이 아니라 새로운 메서드가 생성되어버리는데,

ShowCurrentState()가 존재하지 않아서 문제 있다고 알려준다. ㄳㄳ

 

오버라이딩의 조건   

1. 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)   

2. 접근제어자를 좁은 범위로 변경할 수 없다. 

- 조상의 메서드가 protected라면, 범위가 같거나 넓은 protected나 public으로 만 변경할 수 있다. 

ex) BaseEnSpeaker에서 클래스에서  Private void showCurrentState()로 생성불가

    (조상메서드는 default이므로)

3. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다. 

 

오버로딩과 오버라이딩

 

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 (New)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것 (Change, Modify)

 

 

 

 

'JAVA > basic' 카테고리의 다른 글

예외처리 / try-catch-finally  (0) 2020.10.21
인터페이스 / interface / implements  (0) 2020.10.20
추상클래스 / abstract class  (0) 2020.10.20
상속 / extends  (0) 2020.10.15
[Singleton] 싱글톤 / 싱글턴 패턴  (0) 2020.10.15
getter / setter  (0) 2020.10.15
접근제어 [ private / public / protected / default ]  (0) 2020.10.15

class 자손클래스 extends 조상클래스/부모클래스

▶ 상속이란? 

- 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것.

- 두 클래스를 조상과 자손으로 관계를 맺어주는 것.

- 자손의 멤버개수는 조상보다 적을 수 없다.(같거나 많다.)

 

- 공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다.

- 조상의 변경은 자손에 영향을 미치지만, 자손의 변경은 조상에 아무런 영향을 미치지 않는다.

 

  • 여기서 중요한 사실은 하위클래스의 생성자 내에서 상위클래스의 생성자호출을 통해서 상위 클래스의 인스턴스 멤버를 초기화 한다는 점이다!
  • 하위 클래스의 생성자는 상위클래스의 인스턴스 변수를 초기화할 데이터까지  자로 전달받아야 한다!
  • 하위 클래스의 생성자는 상위 클래스의 생성자 호출을 통해서 상위 클래스의  스턴스 변수를 초기화한다!
  • 키워드 super는 상위 클래스의 생성자 호출에 사용된다. Super와 함께 표시된 전달되는 인자의 수와 자료형을 참조하여 호출할 생성자가 결정 된다!

Child2에서는 새로운 String 변수를 추가해줌 (name)

GrandChild에서는 부모클래스인 Child2의 변수 name을 사용하기 위해 super를 사용함.

여기서 super는 Child2를 의미한다.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package Oct15;
 
public class CarMain {
 
    public static void main(String[] args) {
        
        //클래스멤버도 상속의 대상이다. 클래스 멤버는 한번만 생성/ 자손클래스의 이름으로도 참조, 호출이가능하다.
        System.out.println(Car.name);
        System.out.println(HybridCar.name);
        
        Car car1 = new Car(100);
        HybridCar car2 = new HybridCar(100,50);
        HybridWaterCar car3 = new HybridWaterCar(100,50,20);
 
        car3.showCurrentGauge();
    }
 
}
 
class Car {
    static String name="뽀카";
    int gasolinegauge;
    // car(){}
    
    Car(){
        
    }
    Car(int gasolinegauge){
        this.gasolinegauge=gasolinegauge;
    }
}
 
class HybridCar extends Car {
 
    int electronicGauge;
    /*
      HybridCar(){
       super();
        }
     */                              // Car(){}가 없다면 상위클래스 생성자에 필요한 것을 넣어줘야함
    
    HybridCar(int gasolinegauge, int electronicGauge){
        // 조상 클래스의 멤버를 초기화하는 생성자 호출
        // super(gasolinegauge);  // 조상클래스super는 꼭 첫줄에!
        super();
        // 새롭게 정의한 Hybrid 클래스의 멤버를 초기화해줌
        this.electronicGauge=electronicGauge;
        
    }
 
    
}
 
class HybridWaterCar extends HybridCar {
    /*
      
      HybridWaterCar()
      { super(); 
      }
     
     */
    HybridWaterCar(int gasolinegauge, int electronicGauge, int watergauge){
        super(gasolinegauge, electronicGauge);
        this.waterGauge=watergauge;
    }
    
    
    int waterGauge;
 
    public void showCurrentGauge() {
        System.out.println("잔여 가솔린 : " + gasolinegauge);
        System.out.println("잔여 전기 : " + electronicGauge);
        System.out.println("잔여 water : " + waterGauge);
    }
}
cs

'JAVA > basic' 카테고리의 다른 글

인터페이스 / interface / implements  (0) 2020.10.20
추상클래스 / abstract class  (0) 2020.10.20
오버라이딩 Override / Overriding & 다형성  (0) 2020.10.16
[Singleton] 싱글톤 / 싱글턴 패턴  (0) 2020.10.15
getter / setter  (0) 2020.10.15
접근제어 [ private / public / protected / default ]  (0) 2020.10.15
import  (0) 2020.10.15

객체 중에는 전체 시스템을 통틀어 딱 하나만 존재해야 하는 것들이 있다.

그럴 때 이용하는 싱글턴/톤 패턴

 

'JAVA > basic' 카테고리의 다른 글

추상클래스 / abstract class  (0) 2020.10.20
오버라이딩 Override / Overriding & 다형성  (0) 2020.10.16
상속 / extends  (0) 2020.10.15
getter / setter  (0) 2020.10.15
접근제어 [ private / public / protected / default ]  (0) 2020.10.15
import  (0) 2020.10.15
배열과 메소드  (0) 2020.10.13

Getter 와 Setter 메서드 : 

  1. getter메서드
    • 반드시 소문자 get을 접두사로 사용 
    • get다음에 이어지는 단어의 첫번째 글자는 반드시 대문자로 작성
    • 반드시 리턴값이 있어야 한다 (void 불가)
    • 매개변수가 없어야 한다.
  2. setter메서드
    • 반드시 소문자 set을 접두사로 사용
    • set다음에 이어지는 단어의 첫번째 글자는 반드시 대문자로 작성
    • 반드시 리턴값이 없어야 한다 (반드시 void형 이어야 한다)
    • 반드시 매개변수가 있어야한다

hsprnote.blogspot.com/2017/03/java-getter-setter.html

 

JAVA - getter / setter 메서드

일반적으로 클래스에 선언된 맴버변수를 외부에서 수정하려면 인스턴스를 생성후 해당 변수명을 호출해와 직접적으로 수정해줬다. 하지만 위와 같은 방법으로 맴버변수값을 변경할 경우 정보�

hsprnote.blogspot.com

 

 

 

'JAVA > basic' 카테고리의 다른 글

오버라이딩 Override / Overriding & 다형성  (0) 2020.10.16
상속 / extends  (0) 2020.10.15
[Singleton] 싱글톤 / 싱글턴 패턴  (0) 2020.10.15
접근제어 [ private / public / protected / default ]  (0) 2020.10.15
import  (0) 2020.10.15
배열과 메소드  (0) 2020.10.13
2차원 배열 / 다차원 배열  (0) 2020.10.13

 

 

(default는 아무것도 안적힌 기본 상태일때를 말함)

제어자 같은 클래스 같은 패키지 자손 클래스 전체
public [공용멤버] O O O O
protected O O O  
default [패키지멤버] O O    
private [전용멤버] O      

 

 

 

// 제어자 + [class/변수/메서드/생성자] 

Class 인스턴스 생성 제어 / 클래스를 다른클래스가 사용하게 하거나 못하게 하거나를 제어
변수 변경, 참조, 읽기 제어
메서드 호출 제어
생성자 인스턴스 생성 제어

 

// 제어자의 조합

대상 사용가능한 제어자
클래스 public, (default), final, abstract
메서드 모든 접근 제어자, final, abstract, static
멤버변수 모든 접근 제어자, final, static
지역변수 final

 

1. 메서드에 static과 abstract를 함께 사용할 수 없다.

-  static메서드는 몸통(구현부)이 있는 메서드에만 사용할 수 있기 때문이다. 

 

2. 클래스에 abstract와 final을 동시에 사용할 수 없다.

- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다. 

 

3. abstract메서드의 접근제어자가 private일 수 없다.

 abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 없기 때문이다.

 

4. 메서드에 private과 final을 같이 사용할 필요는 없다.

- 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.

 

 

~예제~

'JAVA > basic' 카테고리의 다른 글

상속 / extends  (0) 2020.10.15
[Singleton] 싱글톤 / 싱글턴 패턴  (0) 2020.10.15
getter / setter  (0) 2020.10.15
import  (0) 2020.10.15
배열과 메소드  (0) 2020.10.13
2차원 배열 / 다차원 배열  (0) 2020.10.13
변수의 초기화 / 초기화 블럭  (0) 2020.10.08

sql에도 있고 util에 있는 Date처럼 내가 원하는 애들이 이름이 같으면 이상한걸 쓸수 있으니 주의해야 한다.

 

'JAVA > basic' 카테고리의 다른 글

[Singleton] 싱글톤 / 싱글턴 패턴  (0) 2020.10.15
getter / setter  (0) 2020.10.15
접근제어 [ private / public / protected / default ]  (0) 2020.10.15
배열과 메소드  (0) 2020.10.13
2차원 배열 / 다차원 배열  (0) 2020.10.13
변수의 초기화 / 초기화 블럭  (0) 2020.10.08
객체지향 : class 생성  (0) 2020.10.07

salix97.tistory.com/5

'memo' 카테고리의 다른 글

java.io.FileNotFoundException  (0) 2020.10.26
제네릭  (0) 2020.10.22
코드블럭 꾸미기  (0) 2020.10.22
string stringbuffer stringbuilder  (0) 2020.10.13
ArrayList 참고글  (0) 2020.10.12
public static void  (0) 2020.10.12
이클립스 단축키  (0) 2020.10.07

+ Recent posts