TIL) Java - 인터페이스 등

oatraspberry·2022년 12월 13일
post-thumbnail

오버라이딩

  • 부모클래스에게 상속받은 메서드를 재정의하여 사용(덮어쓰기 개념)

메서드 오버라이딩을 위한 조건

  • 부모클래스의 메서드와 시그너처 및 리턴 타입 통일
  • 부모클래스의 메서드보다 접근지정자는 같거나 넓어야 함
  • 시그니처: 메서드명과 매개변수 타입과 개수

인스턴스 멤버/STATIC 멤버 오버라이딩
instance 필드 - 오버라이딩X
instance 메서드 - 오버라이딩O->메서드 오버라이딩
static 필드 - 오버라이딩X
static 메서드 - 오버라이딩X

인스턴스 필드와 정적 멤버의 중복
인스턴스 필드 - 메소드 밖에 있는 변수
인스턴스 필드는 오버라이딩이 되지 않음
static 메서드는 오버라이딩이 되지 않음

super - 부모클래스의 객체

필드명 중복 또는 메서드 오버라이딩으로 가려진 부모의 필드/메서드를 호출하기 위해 주로 사용함.

super 키워드가 자주 사용되는 이유
코드가 간단해짐

super()

생성자 내부에서만 사용 가능

최상위 클래스 Object

모든 자바 클래스의 부모 클래스

Object oa = new A(); A aa = new A();
Object ob= new B(); B bb = new B();
		  A ab = new B();

객체의 정보 패키지.클래스명@해쉬코드
일반적으로 오버라이딩해서 사용

toString() - 숫자를 문자형으로 만들기
정수(Int) - Integer.toString
실수(Float) - Float.toString
실수(Double) - Double.toString
롱(Long) - Long.toString

문자를 숫자로 바꾸기
정수(Int) - Integer.parseInt
실수(Float) - Float.parseFloat
실수(Double) - Double.parseDouble
롱(Long) - Long.parseLong

Object 메서드 - equals()

문자열은 equals()로 비교한다.
객체의 stack 메모리에 만들어진 변수의 내용인 번지값 비교
비교연산자 ==와 동일한 결과

hashcode()

객체의 hashCode() 값 리턴. HashTable, HashMap 등의 동등비교에 사용

final 필드/지역변수는 값의 변경뿐만 아니라 추가적인 값의 대입 자체가 불가하다.

abstract(추상) 메서드

완성되지 않은 미완성 메서드
존재 목적: 부모 타입으로 cry() 호출을 위해 기능이 없으니 메서드의 이름만 정의.
Animal animal1 = new Cat()과 같이 다형적 표현을 사용했을 때도 animal1.cry()의 형태로 cry() 메서드를 호출하기 위해서임.

class Animal {
	void cry() {
	} // 메서드 자체는 아무런 기능을 수행하지 않음.
}

추상(abstract) 메서드의 정의 방법

  1. 리턴타입 앞에 abstract
  2. 기능을 정의하는 () 생략
abstract void cry();

추상메서드를 하나도 포함하지 않아도 추상클래스로 정의는 가능하다
다만 추상메서드가 없는 경우 추상메서드로 정의할 이유가 없다.

추상 클래스 - 서로 비슷한 기능을 하는 클래스들을 묶을 때 사용한다.

인터페이스

서로 다른 기능을 하는 클래스들을 묶을 때 사용
모든 필드가 public static final로 정의
모든 메서드가 public abstract로 정의 (디폴트메서드 제외)
디폴트 메서드는 public으로 정의
자체적으로 객체 생성 불가함.

interface A {
	public static final int a = 3;
	public abstract void abc();
}
// static 객체 생성하지 않고도 쓸 수 있음.

구현하기 implements

부모클래스의 미완성메서드(추상메서드)를 자식클래스에서 재정의(완성)

메서드의 완성과 미완성의 구분 기준 -> 중괄호의 존재 여부
중괄호안에 아무런 코드가 없어도 완성된 메서드
-> 아무일도 하지 말라고 명확히 기능이 표현된 메서드

  • 오버라이딩
    부모클래스 -> 자식클래스
    완성메서드 -> 완성메서드
  • 구현하기 implements
    부모클래스 -> 자식클래스
    미완성메서드 -> 완성메서드

인터페이스의 특징

interface A {
	public static final int a = 3;
	public abstract void abc();
}

interface B {
	int b = 3; // public static final 자동 추가
	void bcd();  // public abstract 자동 추가
}

public static void main(String[] args) {
	// 1. 필드의 static 특징 확인 (클래스/인터페이스 이름으로 바로 접근 가능)
	System.out.println(A.a); // A
	System.out.println(B.b);
	
	// 2. 필드의 final 특징 확인(값 변경 불가)
	A.a = 4; // 불가능
	B.b = 4; // 불가능
}

인터페이스의 상속

상속시 implements 사용
다중상속 가능
클래스(일반클래스/추상클래스)는 다중상속 불가

인터페이스의 필요성

다중상속
협업: 개념 공유
클래스 설계 표준화 유도

디폴트 메서드

인터페이스 내부의 완성된 메서드
디폴트 메서드를 실행하기 위해서는 상속시켜야 한다.

interface 인터페이스명 {
	public default 리턴 타입 메서드명 {
		// 메서드 내용
	}
}

메서드 앞에 default 키워드 추가: 접근지정자 default가 아님. 접근지정자는 자동으로 public 추가됨.
오버라이딩도 가능함.

자식클래스에서 부모인터페이스의 디폴트 메서드 호출법

부모인터페이스이름.super.디폴트메서드이름

정적메서드

인터페이스 내에 정적(static) 메서드
클래스 내부의 정적메서드와 사용방법 동일(객체 생성 없이 클래스 이름으로 바로 접근 가능)

profile
개발자가 될테야

0개의 댓글