[Section 1] 객체 지향 프로그래밍 심화 (상속, 캡슐화)

dohyoungK·2023년 4월 25일
0

객체 지향 프로그래밍

  • 상속 (Inheritance)

    : 기존 클래스를 재활용해 새로운 클래스를 작성하는 방법으로, 상위 클래스를 상속받은 하위 클래스는 상위 클래스의 모든 멤버를 상속 받을 수 있다.
    (객체 지향 프로그래밍에서는 단일 상속만을 허용)

    class Person {
       String name;
       int age;
       
       void eat() {
          System.out.println("밥을 먹습니다.");
       }
    }
    
    class Athlete extends Person { // Person을 상속받아 Person의 멤버를 공유
       String sport;
       
       void exercising() {
          System.out.println("운동을 합니다.");
       }
    }
    
    public class Ex {
       public static void main(String[] args) {
          Athlete at = new Athlete();
          at.name = "park";
          at.age = 20;
          at.sport = "tennis";
          at.eat();
          at.exercising();
          System.out.println(at.name);
          System.out.println(at.sport);
       }
    }
    
    // 출력
    밥을 먹습니다.
    운동을 합니다.
    park
    tennis

    • 포함 관계

      : 클래스의 멤버에 다른 클래스의 참조변수를 선언함으로써 상속처럼 클래스를 재사용할 수 있는 방법

      public class Person {
         String name;
         int age;
         **Address address**;
         
         public Person(String name, int age, Address address) {
            this.name = name;
            this.age = age;
            this.address = address;
         }
         
         public static void main(String[] args) {
            Address address1 = new Address("서울", "한국");
            
            Person p = new Person("park", 20, address1);
         }
      }
      
      class Address {
         String city, country;
         
         public Address(String city, String country) {
            this.city = city;
            this.country = country;
         }
      }

    • 메서드 오버라이딩 (Method Overriding)

      : 상위 클래스에 정의되어 있는 메서드를 하위 클래스에 동일 메서드명의 메서드를 다른 내용으로 재정의 하는 것

      class Vihicle {
         void run() {
            System.out.println("Vihecle is running");
         }
      }
      
      class Bike extends Vihicle {
         void run() { // 상위 Vihicle 클래스의 run() 메서드를 오버라이딩
            System.out.println("Bike is running");
         }
      }
      • 메서드의 이름, 매개변수, 반환 타입이 상위 클래스의 메서드와 동일해야 함
      • 접근 제어자의 범위가 상위 클래스 메서드보다 같거나 넓어야 함
      • 예외 처리는 상위 클래스 메서드와 같거나 하위 예외만 가능

    • super(), super 키워드

      : this(), this 키워드와 같이 super()은 상위 클래스의 생성자를 호출하고, super는 상위 클래스의 객체를 의미한다.

    • Object 클래스, 대표 메서드

      : 자바 클래스의 최상위에 위치한 최상위 클래스로 모든 클래스에 자동으로 extends Object 된다.

      메서드명반환 타입내용
      toString()String객체 정보를 문자열로 반환
      equals()boolean스택 메모리 값을 비교해서 같으면 true, 다르면 false 반환
      hashCode()int객체 위치정보 관련, Hashtable이나 HashMap에서 동일 객체여부 판단 가능
      wait()void현재 스레드 일시정지
      notify()void일시정지 중인 스레드 재동작

  • 캡슐화 (Encapsulation)

    : 정보 은닉을 위해 객체의 속성과 기능의 데이터를 외부로부터 보호하는 것

    • 패키지 (Package)

      : 클래스들을 그룹으로 묶어 효율적으로 관리하기 위한 클래스와 인터페이스의 묶음

    • Import 문

      : 다른 패키지 내 클래스를 패키지명 없이 사용하기 위해 작성하는 구문

    • 접근 제어자 (Access Modifier)

      : 정보 은닉을 위해 클래스나, 필드, 메서드, 생성자 등에 접근 권한을 부여하는 키워드

      접근 제어자접근 범위
      private동일 클래스에서만 접근 가능
      default동일 패키지 내에서만 접근 가능
      protect동일 패키지와 하위 클래스에서 접근 가능
      public모두 접근 가능

    • getter, setter 메서드

      : 정보 보호와 은닉을 위해 접근 제어자를 사용해 캡슐화를 달성하면서도 데이터에 접근하고 싶을 때 사용하는 메서드

      • getter 메서드

        : 변수 값을 읽어오기 위해 사용

      • setter 메서드

        : 변수 값을 변경하기 위해 사용

        class Person {
           private String name;
           private int age;
           
           public String getName() { // 변수 값 반환
              return name;
           }
           
           public int getAge() { // 변수 값 반환
              return age;
           }
           
           public void setName(String name) { // 변수 값 변경
              this.name = name;
           }
           
           public void setAge(int age) { // 변수 값 변경
              this.age = age;
           }
        }

0개의 댓글