study/Java

[sist] 2024.01.17_Java : Polymorphism(다형성), annotation(주석), abstract class(추상클래스)

듀2 2024. 2. 24. 23:33

*  Polymorphism(다형성)

- 객체다형성 : is a 관계

- method 다형성 : 같은 이름의 method를 작성

 1) Overload(Overloading) : 클래스 하나에서 같은 이름의 method를 여러 개 작성.

 2) Override(Overriding) : 상속관계의 클래스에서 같은 이름의 method를 작성.

 

* Override(Overriding)

- 상속관계에서 같은 이름의 method를 자식클래스에서 재정의 하는 것.

- 부모가 제공하는 기능이 자식에게 맞지 않을 때, 자식이 자신의 상황에 맞게 바꿔 사용하는 것.

- final이 있는 method는 Override가 되지 않는다. (부모의 기능을 변경하지말고 사용할 때)

- Overriding된 method는 자식 클래스의 method가 최우선적으로 호출된다.

- 규칙)

  접근지정자 달라도 된다.(광의의 접근 지정자로만 변경 가능. default -> protected -> public)

  반환형, method명, 매개변수 같아야 한다.

// Object -> 모든 클래스의 부모 클래스

public class Test{
    public void method(){
    	A에 대한 일
    }
}

public class TestSub extends Test{
	@Override
    public void method(){
    	B에 대한 일
    }
}

// 자식클래스로 객체화
TestSub ts = new TestSub();
ts.method(); // B에 대한 일 수행

// is a 관계의 객체화 -> 부모클래스명 객체명 = new 자식클래스의 생성자();
Test t = new TestSub();
t.method(); // 부모의 method를 호출하지 않고 자식의 method를 최우선으로 호출한다.

 

* is a 관계의 객체화

- 객체 다형성

- is a 관계로 객체화를 하면 자식 클래스를 사용하여 생성하고, 부모 클래스를 사용한 객체에 할당하는 것.

- 객체명으로는 부모 클래스의 자원(변수, method)을 사용할 수 있고, 자식 클래스가 Override한 method는 사용 가능하다.

public class Test{
    int i;
    
    public void printI(){
    	i를 출력하는 일
    }
}

public class TestSub extends Test{
	int j;
    
    public void test(){
    	B에 대한 일
    }
    
    @Override
    public void printI(){
    	j를 출력하는 일
    }
}

// 자식클래스로 객체화 : 나와 나의 부모 객체에서 제공하는 모든 것 사용 가능
TestSub ts = new TestSub();
ts.i = 10;	// 부모의 변수 사용 가능
ts.j = 20;	// 자식의 변수 사용 가능

ts.test();	// 자식의 method 호출 가능
ts.printI();	// 자식의 printI 호출 가능

// is a 관계의 객체화 : 부모의 제공 기능, 자식이 Override한 method
Test t = new TestSub();
t.i = 100;	// 변수 사용 가능
t.j = 200;	// 자식이 가진 변수 사용 불가(Test 클래스에는 j가 없다.)

t.test();	// 자식이 가진 method 사용 불가(Test 클래스에는 test method가 없다.)
t.printI();	// 호출 가능. 단, Overriding한 method가 존재하면 부모 것이 아닌 자식의 method 호출

 

* System.out.println()에 객체를 넣어주면 그 안에서 입력된 객체의 toString()을 호출해 준다.

=> 주소가 아닌 메시지 출력이 가능.

=> 이 또한 toString() method를 Override 한 것 !


* annotation (주석 달기)

- JDK1.5에서부터 지원되는 기능.

- compiler에게 컴파일 시에 명령을 전달하는 기능을 하는 주석.

- 작성 위치는 class 위, method 위, 지역변수 위.

- 사용법)

// @annotation명

@Deprecated	// method 위 설정, 비추천 method로 표현
@Override	// method 위 설정, Override의 작성
@SuppressWarnings	// 지역 변수 위, method 위 설정, 경고를 무시
@SafeVargs	// V.A의 데이터형을 제한
@FuncationalInterface	// abstract method가 하나인 인터페이스를 만들 때(Lamda식을 사용할 목적으로 인터페이스를 만들 때)

 


 

* 특정 클래스만 상속을 받아야 할 때.

 - JDK1.5에서부터 제공되는 기능.

 - 자식 클래스가 존재하지 않으면 error 발생.

 - 사용법)

// 부모클래스
public sealed class 클래스명 permit 자식클래스,,,, {	// 자식클래스가 존재하지 않으면 error

}

// 자식클래스
public non-sealed class 클래스명 extends 부모클래스명{

}

 


* class의 다양한 형태

 

* abstract class (추상클래스)

- 상속을 위해서 만드는 부모 클래스.

- abstract method를 가진다.

- 직접 객체화가 되지 않는다. 자식 클래스가 객체화되면 그 때에는 객체화 가능.

- 작성법)

 접근지정자 abstract class 클래스명 extends 부모클래스명 implements 구현인터페이스,,,,{}

 

* abstract method

- method body를 가지지 않는 method.

- method의 정보만 가지고 있는 method로 일을 할 수 없다.

- 자식 클래스가 반드시 구현해야 할(Override) 일의 목록을 정의할 때 사용. => 구현의 강제성

- Overload가 된다. (같은 이름의 추상 method를 여러 개 만들 수 있다.)

- 추상 method는 직접 호출할 수 없다. (body가 없음)

- 작성법)

 접근지정자 abstract 반환형 method명(매개변수,,,,);

- 모든 자식 클래스가 method를 반드시 가져야 하지만, 부모가 제공하는 기능을 사용하지 않고 Override해서 사용해야 하는 경우.

public abstract class Test{
    public Test(){
    }
    
    public abstract String msg();	// 구현의 강제성
}

public class TestSub extends Test{
	public TestSub(){
    	super();
    }
    
    @Override
    public String msg(){
    	return "비와 같은 눈";
    }
}

// * 객체화 - 추상클래스는 직접 객체화 불가능
Test t = new Test();	// 불가능

// * 자식클래스로 객체화
TestSub ts = new TestSub();
String str = ts.msg();

// * is a 관계의 객체화
Test t = new TestSub();
String str = t.msg();

 

 

* final

- 변수, method, class에 사용할 수 있다.

 

* 변수 final - 선언 시에만 값 할당 가능.

public final int i = 30;
i = 200; // error

 

* method final - override 막을 때 사용.

public class Test{
    public final void test(){
    }
}

// Override 불가
public class TestSub extends Test{
	public void test(){
    }
}

 

* class final

- 상속을 막을 때 사용.

- 클래스가 제공하는 기능을 변경 없이 사용해야 할 때.

- abstract과 함께 사용할 수 없다.

public final class Test{

}

// 상속 불가
public class Sub extends Test{

}
728x90