상속& 캡슐화

InSeok·2022년 7월 12일
0

TIL

목록 보기
12/51

목차


  1. 상위 클래스 - 하위클래스의 상속 관계
  2. extends 키워드
  3. 포함관계와 상속관계의 차이
  4. 메서드 오버라이딩
  5. super , super( )
  6. 캡슐화
  7. 패키지
  8. 접근제어자
  9. getter / setter

배운 내용


상속

정의

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소
  • extends 키워드를 사용하며, 클래스명 다음에 extends 상위 클래스명을 사용하여 정의

특징

  • 하위 클래스는 상위 클래스가 가진 모든 멤버(필드, 메서드, 이너클래스)를 상속받는다.
  • 하위 클래스의 멤버수 ≥ 상위 클래스의 멤버수
  • 단일 상속만을 허용(인스턴스는 다중상속가능)

장점

  • 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성가능
  • 코드의 중복을 제거
  • 다형적 표현이 가능

예시

class Person {
    String name;
    int age;
		void walk(){
        System.out.println("걷습니다.");
    };
    void eat(){
        System.out.println("밥을 먹습니다.");
    };
}

class Dancer extends Person { // Person 클래스로부터 상속
    String groupName;

    void dancing(){
		    System.out.println("춤을 춥니다.");
		};
}

포함 관계

정의

  • 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것
public class Employee {
    int id;
    String name;
    Address address; 
}

class Address {
    String city, country;

}
  • Employee 클래스 멤버 변수로 Adress 클래스가 정의되있다.
  • 원래, Address 클래스 내 인스턴스 변수 city, country를 각각 Employee 클래스의 변수로 정의해야하지만, Address 클래스로 변수들을 묶어준다음 Employee 클래스 안에 참조변수를 선언하는 포함관계로 재상용 → 코드 중복 제거
  • 클래스 간의 관계가 ‘~은 ~이다(IS-A)’ 관계 → 상속
  • ~은 ~을 가지고 있다(HAS-A) 관계 → 포함

메서드 오버라이딩

정의

  • 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것

조건

  1. 메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.

  2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.

  3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

예시

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

public class Bike extends Vehicle { // Vehicle 클래스 상속
    void run() {
        System.out.println("Bike is running"); // 메서드 오버라이딩
    }
// 출력값 : "Bike is running"
Bike bike = new Bike(); // 각각의 타입으로 선언 + 각각의 타입으로 객체 생성
Car car = new Car();
MotorBike motorBike = new MotorBike();

Vehicle bike2 = new Bike(); // 상위 클래스 타입으로 선언 + 각각 타입으로 객체 생성
Vehicle car2 = new Car();
Vehicle motorBike2 = new MotorBike();

// 배열로 한번에 관리하기

Vehicle[] vehicles = new Vehicle[] { new Bike(), new Car(), new MotorBike()};
for (Vehicle vehicle : vehicles) {
		vehicle.run();
}

super 키워드와 super()

  • 상위 클래스의 존재를 상정하며 상속 관계를 전제
  • super 키워드는 상위 클래스의 객체의 멤버 값을 참고
  • super()상위 클래스의 생성자를 호출
    • 생성자 안에서만 사용가능하고, 반드시 첫 줄에 와야한다.

Object 클래스

  • 최상위 클래스

  • 자바의 모든 클래스는 Object 클래스로부터 확장된다

  • 컴파일러는 아무런 상속을 받지 않는 클래스에 자동적으로 extends Object를 추가

  • Object 클래스는 자바 클래스의 상속계층도에 가장 위에 위치하기 때문에 Object 클래스의 멤버들을 자동으로 상속받아 사용가능

  • Object 메서드

toString()String객체 정보를 문자열로 출력
equals(Object obj)boolean등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
hashCode()int객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
wait()void현재 쓰레드 일시정지
notify()void일시정지 중인 쓰레드 재동작

캡슐화

정의

  • 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것

목적

  • 데이터 보호의 목적
  • 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지(정보 은닉)

패키지

정의

  • 특정한 목적을 공유하는 클래스와 인터페이스의 묶음
  • 물리적인 하나의 디렉토리(directory)이고, 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있다.
  • 디렉토리의 계층 구조 간 구분은 점(.)으로 표현

목적

  • 클래스들을 그룹 단위로 묶어 효과적으로 관리하기 위한 목적

장점

  • 클래스의 충돌방지
    • 같은 이름의 클래스를 가지고 있더라고 각각 다른 패키지에 소속되어 있다면 이름명으로 인한 충돌이 발생하지 않음.

Import문

  • 다른 패키지 내의 클래스를 사용하기 위해 사용
  • import 패키지명.클래스명;
  • import 패키지명.*; → 해당 패키지내 모든 클래스 import

접근 제어자

제어자(Modifier)

정의

  • 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드(형용사 역할)

종류

접근 제어자public, protected, (default), private
기타 제어자static, final, abstract, native, transient, synchronized 등

특징

  • 하나의 대상에 대해서 여러 제어자를 사용가능
    • but, 접근 제어자는 단 한번만 사용가능

접근 제어자(Access Modifier)

기능

  • 클래스 외부로의 불필요한 데이터 노출을 방지(data hiding)할 수 있고, 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있습니다.(캡슐화)

종류

접근 제어자접근 제한 범위
private동일 클래스에서만 접근 가능
default동일 패키지 내에서만 접근 가능
protected동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
public접근 제한 없음

getter와 setter 메서드

목적

  • 캡슐화의 목적을 달성하면서도 데이터의 변경이 필요한 경우
  • private접근제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때

setter 메서드

  • 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해주고
    일반적으로 메서드명에 set-을 붙여서 정의

getter 메서드

  • 설정한 변수 값을 읽어오는 데 사용
  • get-을 메서드명 앞에 붙여서 사용

예시

public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker();
        w.setName("김코딩");
        w.setAge(30);
        w.setId(5);

        String name = w.getName();
        System.out.println("근로자의 이름은 " + name);
        int age = w.getAge();
        System.out.println("근로자의 나이는 " + age);
        int id = w.getId();
        System.out.println("근로자의 ID는 " + id);
    }
}

class Worker {
    private String name; // 변수의 은닉화. 외부로부터 접근 불가
    private int age;
    private int id;

    public String getName() { // 멤버변수의 값
        return name;
    }

    public void setName(String name) { // 멤버변수의 값 변경
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 1) return;       //setter 메서드내 조건에 맞을경우 데이터값 변경가능
        this.age = age;           //  조건에 안맞을경우 데이터값 저장하지 않고 return.
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

어려운 내용(에러)


문제

해결

profile
백엔드 개발자

0개의 댓글