컴공선배_22Days 챌린지 6일차

아사비치즈스틱·2022년 2월 26일
0

Title

💡 상속 / 캡슐화 / 다형성

✏️ 상속


❓ 상속이란 무엇일까?

  • 상속이란 무엇일까?

ex) A가 부모로부터 건물을 물려 받는다, 재산을 상속 받는다.

이처럼 상속은 자식이 부모로 부터 “무엇인가”를 물려 받는다 라고 한다.

자바의 상속

💡 자바의 상속 = 부모 (클래스)로 부터 자식(클래스)이 “변수와 메소드”를 물려 받는다

상속의 장점

  1. 중복된 코드를 줄일 수 있다.
  2. 유지 보수가 편리하다.
  3. 다형성을 구현할 수 있다.

상속의 형식

  • extends 키워드에 상속 받을 부모 클래스 명을 적는다

자바에서의 자식 클래스는 여러 부모로부터 다중 상속을 받는 것은 불가능하다. 즉, 1개의 부모 클래스로부터 단일 상속만 허용된다. but 부모 클래스는 여러 개의 자식 클래스에게 상속이 가능하다.

예시

class A {
	String aField = "클래스 A 필드";
	public void aMethod() {
		System.out.println(aField);
	}
}

class B extends A {
	String bField = "클래스 B 필드";
	public void bMethod() {
		System.out.println(aField); // 부모 클래스 필드 사용
		System.out.println(bField); // 본인 클래스 필드 사용
	}
}

class C extends B {
	String cField = "클래스 C 필드";
	public void cMethod() {
		System.out.println(aField); // 조부모 클래스 필드 사용
		System.out.println(bField); // 부모 클래스 필드 사용
		System.out.println(cField); // 본인 클래스 필드 사용
	}
}

public class SuperSubEx01 {
	public static void main(String[] args) {
		System.out.println("----------A----------");
		A a = new A();
		a.aMethod(); // 본인 메소드 사용
		// a.bMethod(); // A(부모) 객체로 B(자식) 메소드 접근 불가
		System.out.println("----------A----------");
		System.out.println("----------B----------");
		B b = new B();
		b.aMethod(); // 부모 메소드 사용
		b.bMethod(); // 본인 메소드 사용
		// b.cMethod(); // B(부모) 객체로 C(자식) 메소드 접근 불가
		System.out.println("----------B----------");
		System.out.println("----------C----------");
		C c = new C();
		c.aMethod(); // 조부모 메소드 사용
		c.bMethod(); // 부모 메소드 사용
		c.cMethod(); // 본인 메소드 사용
		System.out.println("----------C----------");
	}
}
  1. 먼저 A, B, C클래스를 각각 정의하고 각 클래스 별로 필드(전역변수)와 메소드를 정의하였다.
  2. 그리고 B는 A에게 C는 B에게 상속을 받는다(A→B→C)
  3. 각 메소드에서 부모 클래스의 필드를 자식 클래스가 사용하여 데이터를 출력 한다.
  4. main 메소드에서는 각 클래스 별로 인스턴스를 생성하고 자식 클래스 인스턴스에서 부모 클래스의 메소드를 호출한다.

참고 자료: https://blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220960019390

✏️ 캡슐화


❓ 캡슐화란 무엇일까?

💡 캡슐화 = 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 숨기는 것 (주로 중요한 데이터를 쉽게 바꾸지 하지 못하도록 할 때 사용함)

❓ 캡슐화를 왜 할까?

💡 접근을 제한함으로써 유지보수나 확장 시 오류의 범위를 최소화할 수 있고 객체 내의 정보 손상과 오용을 방지한다.
  • 자바의 캡슐화는 접근 제어자를 통해 이루어진다.

자바의 접근 제어자

접근 제어자범위
public접근 제한 없음
protected동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능
default아무런 접근 제어자를 명시하지 않음, 동일 패키지 내에서만 접근 가능
private자기 자신만의 클래스 내에서만 접근 가능

예시


public class EncapsulationClass {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

//메인 클래스
public class Main {

    public static void main(String[] args) {
	// write your code here
        EncapsulationClass cap = new EncapsulationClass();

        cap.setId(123);
        cap.setName("jay");

        System.out.println(cap.getId());
        System.out.println(cap.getName());
    }
}

출력값

123
jay
  • private 접근 제어자를 통해 변수를 선언하였기에 외부에서 접근할 수 없다.
  • 따라서 getter, setter 메소드를 통해 변수에 값을 저장하고 가져올 수 있게 한다.

참고 자료: https://jaynamm.tistory.com/entry/JAVA-자바-캡슐화-Encapsulation

✏️ 다형성


❓ 다형성이란 무엇일까?

💡 다형성 = 하나라는 객체가 여러가지 타입을 가질 수 있다는 것을 의미한다.

❓ 참조 변수의 다형성

  • 자바에서는 다형성을 위해 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 한다.
  • 이때 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 적어야 참조 할 수 있다.

예시

class Parent { ... }

class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용

Child ch = new Child();   // 허용

Parent pc = new Child();  // 허용

Child cp = new Parent();  // 오류 발생.
  • 부코 클래스 타입의 참조 변수로도 자식 클래스 타입의 인스턴스를 참조할 수 있다.
  • 하지만 반대인 경우인 자식 클래스 타입의 참조 변수로는 부모 클래스 타입의 인스턴스를 참조할 수 없다.

❓ 참조 변수의 타입 변환

  • 자바에서의 참조 변수는 다음과 같은 조건에 따라 타입 변환을 할 수 있다.

조건

  1. 서로 상속 관계에 있는 클래스 사이에만 타입 변환을 할 수 있다.
  2. 자식 클래스 타입에서 부모 클래스 타입으로의 타입 변환은 생략할 수 있다.
  3. 하지만 부모 클래스 타입에서 자식 클래스 타입으로의 타입 변환은 반드시 명시해야 한다.

문법

(변환할타입의클래스이름) 변환할참조변수

예시

class Parent { ... }

class Child extends Parent { ... }

class Brother extends Parent { ... }

...

Parent pa01 = null;

Child ch = new Child();

Parent pa02 = new Parent();

Brother br = null;

 

pa01 = ch;          // pa01 = (Parent)ch; 와 같으며, 타입 변환을 생략할 수 있음.

br = (Brother)pa02; // 타입 변환을 생략할 수 없음.

br = (Brother)ch;   // 직접적인 상속 관계가 아니므로, 오류 발생.

참고 자료: http://www.tcpschool.com/java/java_polymorphism_concept

profile
달리는 개발자

0개의 댓글