데브코스/강의 정리

오버로딩, 오버라이딩, 인터페이스, 람다

케케_ 2024. 10. 28. 16:36

다형성

: 다른 그림 찾기 같이 멀리서 보면 같지만 자세히 보면 다름

: 함수 이름이 같더라도 전달 인자의 타입이나 개수에 따라 구분

: 객체 지향에서는 대표적으로 오버로딩과 오버라이딩 기법이 있음

--> 면접 단골 질문~~

 

 

오버로딩

: 과적하다, 적재하다

: 겉모습은 똑같지만 내용이 다른 경우

: 이름이 같은 함수일지라도 전달인자 타입이나 개수가 다른 경우

예) 컨테이너 겉모습은 다 같지만, 내용은 다 다름

예) 스타크래프드의 오버로드 유닛의 예

 

int Plus (int a, int b)
{
	return a + b;
}

char Plus (char a, char b)
{
	return a + b;
}
  • 함수 사용 시 매개변수의 타입과 개수에 따라 알아서 대응하는 함수를 사용해줌

 

오버라이딩

: 위로 올라탄다, 엎어친다

: 기본의 것을 덮어 버리는 개념 (재정의)

: 상속 대념이 기반

 

- 부모의 함수를 그대로 가져와서 새로 만들면 됨

 

- 함수포인터를 객체 포인터 형태로 확장 (플러그인)

 

 

인터페이스

: 메소드의 목록만을 가지고 있는 명세, 사용자 정의 타입

: 메소드의 목록만 선언하고 구현은 하지 않음

: 본체가 정의되지 않는 추상 메소드만 갖음

: 인터페이스를 받는 자식클래스는 '반드시' 메소드를 오버라이딩해 구현해야 됨

 

선언 형태

접근지정자 interface 이름 : 기반인터페이스(없어도 됨)
{
}

 

인터페이스를 상속받는 클래스 형태

접근지정자 class 자식클래스이름 : 인터페이스
{
}

 

사용 이유

- 목적 : 기능을 추가, 수정의 개념보단 동일한 개념의 기능을 새롭게 구현하는 기능

- 공동 작업 시 '표준'을 정하는 역할

 

추상 클래스를 상속하는 경우

 - 일반적으로 클래스를 사용하는 이유(목적) : 확장

 

public interface 통화기능 {}
public interface 문자메세지기능 {}
public interface 와이파이기능 {}
public interface 블루투스기능 {}

//다중상속
public interface 스마트폰_기본기능 : 통화기능,문자메세지기능,와이파이기능,블루투스기능
{
	void 통화기능구현 ();
    void 문자메세지기능구현 ();
    void 와이파이기능구현 ();
    void 블루투스기능구현 ();
}

public class 삼성폰 : 스마트폰_기본기능 {
	public void 통화기능구현 (){console.log ("삼성폰 통화기능")};
    public void 문자메세지기능구현 (){console.log ("삼성폰 문자메세지기능")};
    public void 와이파이기능구현 (){console.log ("삼성폰 와이파이기능")};
    public void 블루투스기능구현 (){console.log ("삼성폰 블루투스기능")};
}

 

인터페이스 코드 작성

- 인터페이스 생성하고, 인터페이스로부터 상속받은 클래스를 구현

 

메모리 관리

- 플랫폼 기반의 객체 지향 언어는 가비지 컬렉터가 메모리를 자동 관리함 (malloc처럼 메모리 해제 메소드 필요 X)

- 백그라운드에서 더 이상 사용되지 않는 메모리를 찾아 회수

 

 

 

람다

람다를 통한 화살표 함수의 이해

- 메소드를 미리 정의하지 않고 사용할 때 정의

- 익명 메소드를 사용하면 코드가 간결

- 익명 메소드는 별도의 메소드를 만들지 않으므로 코딩 오버헤드를 줄일 수 있음

- 익명 메소드는 내용 자체가 복잡하면 안됨

- 익명 세모스는 람다식에서 사용

 

람다식

: 기존 익명 메소드를 더 간결하게 만든다

목적 - 코드를 짧고 간결하게 표현

 

람다식 표현

- 델리게이트 본체를 람다식으로 표현

- 델리게이트와 인슈의 개수 및 타입은 일치해야 함

(인수) => 표현식 또는 명령문

 

- 델리게이트 키워드는 사라지면 람다식을 의미하는 => 기호로 대체됨

delegate (int x, int y) {return x+y;}

->     (x,y) => x + y;