[LIKELION] 220926

고관운·2022년 9월 26일

회고

😭 느낀점

  • 상속, 메소드 오버라이딩, 다형성 모두 중요
  • 오버라이딩 vs 오버로딩 중요
  • 다형성 이해의 🔴부분 헷갈리므로 확실히 알고가야 함.

😁 목표

  • 과제 3개 완료하기
  • 백준 코딩 연습

01. 자바-11-상속

상속

상속 정의

부모 클래스와 자식 클래스가 있으며, 자식 클래스는 부모의 멤버를 상속받아 사용할 수 있음.
(상위 클래스 <- 하위 클래스 형식으로 표시)
(🟢 extends를 사용하여 상속)

상속 사용하는 이유

  • 중복 코드 줄일 수 있음
  • 상위 클래스의 필드와 메소드를 재사용할 수 있음

생성자 호출 순서

부모 클래스의 생성자 -> 자식 클래스의 생성자
🔴 출력 순서가 달라질 수 있기 때문에 주의 필요!

this() vs super()

this() : 자신의 생성자
super() : 부모 생성자
(인자를 넣어서 원하는 생성자를 불러올 수 있음)

컴파일러가 자동으로 해주는 것

  1. 디폴트 생성자가 없으면 컴파일러가 넣어줌
  2. 상속을 했을 때, 부모의 디폴트 생성자를 호출하는 super()을 넣어줌

protected

🔴 패키지가 달라도, 하위 클래스에서 접근가능하도록 함(상속시에만)

실습

super() 사용법

class A{
	int a = 10;
	public A(int a, int b) {
		System.out.println("A 생성자 호출 " + a + b);
	}
}

class B extends A{
	public B(int a, int b) {
		super(a,b);  // 부모생성자
		System.out.println("B 생성자 호출");
	}
}

public class java_11_p11 {

	public static void main(String[] args) {
		B b = new B(1,3);	
	}
}

🟢 super(a,b)를 사용하여 해당 생성자를 불러옴
(🔴 부모 클래스에 기본 생성자가 없으므로 super() 사용 불가)


02. 자바-12-메소드오버라이딩

메소드 오버라이딩

메소드 오버라이딩 정의

상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것 (함수 바디만 다르게)
(🔴 반드시 상속 관계)

실습. 메소드 오버라이딩

class Shape1{
	public void draw() { System.out.println("Shape"); }
}

class Circle1 extends Shape1 {
	@Override
	public void draw() { System.out.println("Circle을 그립니다."); }
}

class Rectangle1 extends Shape1 {
	@Override
	public void draw() { System.out.println("Rectangle을 그립니다."); }
}

class Triangle1 extends Shape1 {
	@Override
	public void draw() { System.out.println("Triangle을 그립니다."); }
}

public class java_12_p5 {

	public static void main(String[] args) {
		// 1번
		Shape1 shape = new Shape1();
		shape.draw();
		
		Rectangle1 rec = new Rectangle1();
		rec.draw();
	}
}

🟢 draw()를 시그니쳐만 동일하게 사용하여 오버라이딩함.

메소드 오버로딩

메소드 오버로딩 정의

같은 이름의 메소드를 중복하여 정의하는 것
(매개 변수의 데이터 타입 또는 개수를 다르게 함)
🟢 상속관계가 아니여도 됨.

메소드 오버로딩의 대표적인 예

println : 매개 변수로 int형, String형 등 다양하게 올 수 있도록 오버로딩되어있음.


03. 자바-13-다형성

다형성

다형성 정의

상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리

변수와 함수

private : 직접적인 접근이 불가능
(자신의 내부 클래스에서만 접근 가능)
publicdefault의 내용은 클래스 대상과 동일

예시

Shape : 상위 클래스, Circle : 하위 클래스일 때,
Shape shape = new Circle();

다형성의 이해

  1. 부모 = 자식 (형변환 없이, 자식 = 부모는 불가능)
  2. 오버라이딩은 자식의 것
    🔴 부모 = 자식을 했을 때, 객체는 오직 부모에 있는 필드와 메소드를 사용할 수 있다 (자식에만 있는 메소드 사용 불가)
    🔴 만약, 오버라이딩되어 있는 메소드가 있을 시, 해당 메소드 실행시 오버라이딩된 메소드가 실행됨. (부모의 메소드 실행X)

다형성의 활용

Shape[] shape = { new Circle(), new Rectangle(), new Triangle() };
for ( Shape s : shape ) {
	s.draw();
}

🟢 배열로 활용 가능

0개의 댓글