새소식

Java

7. 다형성

  • -

 

Encapsulation

- 외부에서 데이터의 접근을 막기 위한 기법이다.

- 멤버 변수들을 private을 선언해 외부에서의 접근을 차단

- 접근 경로는 getter, setter로만 유도하는 방식을 사용한다.

 

 

 

Singleton

- 객체를 처음 한번 선언해 두고,재사용함

- 여러 개의 객체가 필요 없거나, 객체의 비용이 커 삽입/삭제에 불편함이 생기는 경우

class SingletonClass {
  private static SingletonClass Instance; //private한 Instance 객체를 static으로 생성
  private SingletonClass() { //생성자 사용을 제한
	  Instance = new SingletonClass(); // 클래스 로딩중 생성
  }
public static SingletonClass getInstance() { // public은 싱글톤 패턴의 규칙임
if(instance == null) instance = new SingletonClass; 
return Instance;
  }// 실제로 사용할 때 인스턴스를 생성하는 기법(Lazy Loading)
}

public class SingletonTest {
  public static void main(String[] args) {
	  SingletonClass s1 = SingletonClass.getInstance();
	  SingletonClass s2 = SingletonClass.getInstance();
	  if(s1 == s2) System.out.println("같음");
  }
}

 

 

 

 

 

 

다형성(Polymorphism)

- 하나의 객체가 많은 타입을 가질 수 있는 성질

- 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 참조할 수 있다.

public class ParentTest {
	public static void main(String[] args) {
		Object [] Obj = new Object[10];
		Person [] P = new Person[10];
		Obj[0] = new Person();
		Obj[1] = new SpiderMan();
		Obj[2] = 2; // Obj -> Inteager
		P[0] = new Person();
		P[1] = new SpiderMan();
	}

}
class Person{
	int n = 10;
}
class SpiderMan extends Person{
	int n = 20;
}

- Object를 이용하여 배열을 간편하게 사용할 수 있음

- API에서 파라미터로 Object를 받는다는 것은 모든 객체를 처리하겠다는 뜻이다.(매개변수의 다형성)

 

 

 

 

public class AppropriateParameter {
    public void useJump1(Object obj) {
        if (obj instanceof Person casted) {
            casted.jump();
        }
    }

    public void useJump2(Person person) {
        person.jump();
    }

    public void useJump3(SpiderMan spiderMan) {
        spiderMan.jump();
    }
    
    
    public static void main(String[] args) {
        Object obj = new Object();
        Person person = new Person();
        SpiderMan sman = new SpiderMan();

        AppropriateParameter ap = new AppropriateParameter();
        ap.useJump1(obj);
        ap.useJump1(person);
        ap.useJump1(sman);
        System.out.println("=========================");
        //ap.useJump2(obj); //에러 발생!
        ap.useJump2(person);
        ap.useJump2(sman);
        System.out.println("========================");
        //ap.useJump3(obj); // 에러 발생 !
        //ap.useJump3(person); // 에러 발생!
        ap.useJump3(sman);
        // END
    }

Person과 Spider는 상속 관계이다.

 

 

 

 

 

객체의 형변환

­- 하위 타입에서 상위 타입으로 형변환 할 때는 묵시적 캐스팅이 가능하다

- 상위 타입을 하위 타입으로 형 변환 할 때는 명시적 캐스팅을 해야 한다

- 자손 타입의 객체를 조상 타입으로 참조? -> 형변환 필요 없음(자손의 조상정보가 메모리에 있음)

- Wrapper Class 들은 상속관계가 아니기 때문에 명시적 형변환이 필요

- 반대의 경우에는 메모리에 올라와있지가 않아 강제로 형 변환을 해도 자손 고유 메서드는 못씀

- object instanceof type: objecttype이거나 type을 상속받는 클래스면 true를 반환

 

 

 

 

정적 바인딩

- 컴파일 단계에서 참조 변수의 타입에 따라 연결이 달라짐

- 상속 관계에서 객체의 멤버 변수(static, instance)가 중복될 때 또는 static method

동적 바인딩

- 다형성을 이용해서 메서드 호출이 발생할 때 runtime에 메모리의 실제 객체의 타입으로 결정

- 상속 관계에서 객체의 method가 재정의됐을 때, 마지막 재정의된 자식 클래스 메서드 출력

 

 

 

equals

두 객체의 주솟값을 비교하여 같은지 다른지 판별( ==랑 같음)

- 이 메서드를 재정의할 때는 반드시 hashcode도 재정의할 것(HashSet, HashMap에서 사용)

 

'Java' 카테고리의 다른 글

9. Generic  (3) 2024.07.22
8. 추상  (1) 2024.07.20
6. 코드 외 작성할 것들  (0) 2024.07.17
5. 상속  (0) 2024.07.17
4. 객체  (0) 2024.07.16
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.