[Section 1] 객체 지향 프로그래밍 심화 (다형성, 추상화)

dohyoungK·2023년 4월 26일
0

객체 지향 프로그래밍 심화

  • 다형성 (Polymorphism)

    : 한 객체가 여러 형태를 가질 수 있는 성질로 상위 클래스 타입의 참조 변수를 통해 하위 클래스의 객체를 참조하듯이 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것

    class Person {
       public void eat() {
          System.out.println("밥을 먹습니다.");
       }
    }
    
    class Programmer extends Person {
       Public void eat() {
          System.out.println("프로그래머가 밥을 먹습니다.");
       }
    }
    
    public class Test {
       public static void main(String[] args) {
          Person person = new Person();
          Person programmer = new Programmer(); // 객체와 참조 변수의 타입이 달라도 하위 클래스가 상위 클래스 참조 가능
       }
    }
    • 참조 변수의 타입 변환

      : 사용 가능한 멤버의 개수를 조절하는 것

      class Person {
         public void eat() {
            System.out.println("밥을 먹습니다.");
         }
      }
      
      class Programmer {
         public void eat() {
            System.out.println("프로그래머가 밥을 먹습니다.");
         }
      }
      
      public class Test {
         public static void main(String[] args) {
            Programmer programmer = new Programmer(); 
            Person person = (Person) programmer; // 괄호 생략 가능
            Programmer programmer2 = (Programmer) person; // 괄호 생략 불가
         }
      }
      • 상속 관계의 상위 클래스와 하위 클래스 사이에 타입 변환 가능
      • 하위 클래스에서 상위 클래스로의 변환(업 캐스팅)은 형 변환 연산자 생략 가능
      • 상위 클래스에서 하위 클래스로의 변환(다운 캐스팅)은 형 변환 연산자 명시해야 함
    • instanceof 연산자

      : 참조 변수가 검사한 타입으로 캐스팅이 가능한지 여부를 boolean으로 반환

      참조변수 instanceof 타입

  • 추상화 (Abstraction)

    : 기존 클래스들의 공통 요소들을 추출해 상위 클래스를 만들어 내는 것

    • abstract 제어자

      : 클래스나 메서드 앞에 붙여 추상 클래스, 추상 메서드임을 표시하는 기타 제어자

    • 추상 클래스

      : 메서드의 시그니처만 존재하고 바디는 선언되지 않은 추상 메서드를 포함하는 미완성 설계도로 객체 생성이 불가하다. 하지만 오버라이딩을 통해 하위 클래스에서 각각 상황에 맞는 메서드 구현이 가능하다.

      abstract class Person {
         public String name;
         Public abstract void eat();
      }
      
      class Programmer extends Person {
         public void eat() {
            System.out.println("프로그래머가 밥을 먹습니다.");
         }
      }
    • final 키워드

      : 변경이 불가하거나 확장되지 않는 성질을 가지게 하는 기타 제어자

      키워드 위치의미
      클래스 앞변경, 확장, 상속 불가한 클래스
      메서드 앞오버라이딩 불가한 메서드
      변수 앞값 변경 불가한 상수
    • 인터페이스 (Interface)

      : 서로 다른 두 개의 대상 사이를 연결하는 부분으로 상수와 추상 메서드만을 멤버로 가질 수 있다.

      • 인터페이스 구조

        public interface InterfaceEx {
           public static final int num = 1; // 인터페이스에서 변수 정의할 때는 **public static final** 사용, 생략 가능
           
           public abstract void printNum(); // 인터페이스에서 메서드 정의할 때는 **public abstract** 사용, 생략 가능
        }
      • 인터페이스 구현

        : 클래스명 뒤 implements 인터페이스명 으로 인터페이스를 사용 가능하고, 클래스 내에 인터페이스의 모든 추상 메서드를 구현해야 한다. 그리고 인터페이스는 상속과 달리 다중 구현이 가능하다.

        class 클래스명 implements 인터페이스명 {
           ... // 인터페이스의 모든 추상 메서드 구현
        }
        
        class 클래스명 implements 인터페이스명1, 인터페이스명2, 인터페이스명3 {
           ... // 인터페이스의 모든 추상 메서드 구현
        }
      • 인터페이스 장점

        : 기능이 가지는 역할과 구현을 분리해 개발 시간을 단축하고, 독립적인 프로그래밍을 통해 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화할 수 있다.

0개의 댓글