본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
부트캠프/후기 챌린지

[멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.19)

by 방구석 취준생 2026. 2. 9.

* 해당 글은 백엔드 자바 강의이후 회고 글입니다.

https://bootcamp.likelion.net/school/kdt-backendj-21th

 

백엔드 부트캠프 21기: Java : 멋사 부트캠프

실전 스킬 기반 백엔드 개발자 취업 완벽 대비 교육

bootcamp.likelion.net

 

클래스간 상속

- 상속은 객체지향 프로그램을 유지보수하기 편하고 프로그램을 유연하게 수정하거나 새로운 내용을 추가할수 있게해주는 기반과도 같은 개념이다.

- 기존 클래스의 구조와 기능을 새로운 클래스가 물려받아 확장하는 객체지향 개념이다.

- 상속을 활용하면 중복 코드를 줄일 수 있다.

- 부모 클래스의 기능을 그대로 사용하면서 자식 클래스의 기능 추가, 변경등이 용이하다.

- 공통 기능은 부모에 있고, 개별 기능은 자식에게 있다.

class Child extends Parent {}

 

 클래스는 단일 상속만 지원한다.

* 다이아몬드 문제

아래의 코드를 한번 보자.

class GrandClass {
    void grandMethod(){
        System.out.println("Grand Class Method");
    }
}

class ParentA extends GrandClass {
    @Override
    void grandMethod(){
        System.out.println("ParentA Class Method");
    }
}

class ParentB extends GrandClass {
    @Override
    void grandMethod(){
        System.out.println("ParentB Class Method");
    }
}

class Child extends ParentA, ParentB {
    @Override
    void grandMethod(){
        super.grandMethod(); // ParentA, ParentB 둘 중 어느 클래스의 메서드를 호출할지 모호함
    }
}

 

- 코드가 위와같이 작성되어 있다면 ParentA, ParentB 총 2개의 클래스를 다중 상속받는 Child 클래스는 상속받는 부모 클래스에정의되어 있는 grandMethod() 를 어느 클래스에서 호출해올지 모호해지는 동시에 유지보수 및 프로그램 설계의 복잡성이 증가하게 된다.

- 이러한 문제가 발생하기 때문에 자바는 내부적으로 다중 상속이 불가능하도록 막아두었다.

 

상속 가능 VS 상속 불가능

클래스간의 상속이 이루어질때 부모 클래스의 멤버에 대해 접근제한자로 자식 클래스의 기능 확장을 제한할 수 있다.

  • public/protected 접근제한자를 가지고 있는 필드와 메서드는 자식 클래스에서 상속 받을 수 있다.
  • 생성자와 final 키워드, static, abstract, private,  접근 제한자를 가지고있는 필드와 메서드는 자식 클래스에서 상속 받을 수 없다.

상속은 언제 사용하는게 좋을까?

IS-A 관계 VS HAS-A 관계

IS-A 관계란 일반적인 개념과 구체적인 개념의 관계이다. 즉, '사람은 포유류이다.' 와 같은 관계인것이다.

상속은 IS-A 관계에서 사용하는 것이 가장 효과적이다. 일반 클래스를 점차 구체화 하는 상황에서 상속을 사용하는 것이다.

상속을 사용하면 많은 장점이 있지만 자식 클래스가 부모 클래스에 종속되기 때문에 이질적인 클래스간에는 상속을 사용하지 않는것이 좋다.

 

HAS-A 관계는 어떤 한 객체가 특정한 다른 객체를 자신의 내부 필드로 가지고 있는 관계를 의미한다.

HAS-A 관계를 가진 클래스의 경우 상속을 사용하지 않는것이 좋다. 왜냐하면 이 클래스를 상속받을 자식 클래스가 있을 경우 부모 클래스 내부에 포함되어 있는 특정한 객체와 자식 클래스간에 HAS-A 관계가 성립될 수 있을지 없을지 장담할 수 없기 때문이다.

상속을 사용하면 클래스 간의 결합도가 높아져서 부모 클래스의 변화가 자식 클래스에 미치게 되는 영향이 크다. 따라서 상속은 일반적인 클래스와 구체적인 클래스. 즉, IS-A 관계에서 구현하는 것이 좋다.

메서드 오버라이딩(Overriding)

부모 클래스에서 정의한 메서드가 자식 클래스에서 구현할 내용과 맞지 않는 경우, 자식 클래스에서 이 메서드의 기능을 재정의 할 수 있다. 이를 메서드 오버라이딩(method overriding) 이라고 한다.

- 오버라이딩을 하려면 반환형, 메서드 이름, 매개변수의 갯수, 매개변수의 자료형이 반드시 같아야 한다. 그렇지 않으면 자바 컴파일러는 재정의한 메서드를 기존 메서드와 다른 메서드로 인식한다.

- 접근 제어자는 더 좁아질 수 없다.(protected -> private(X))

- 예외는 더 넓게 던질 수 없다.

- final 메서드는 오버라이드 할 수 없다.

 

@Override 어노테이션

@Override 어노테이션은 '이 메서드는 재정의된 매서드이다.' 라고 컴파일러에 명확히 알려주는 역할을 한다.

  • 자바에서 제공하는 어노테이션은 컴파일러에게 특정한 정보를 제공해주는 역할을 한다.
  • 예를 들어 @Override 어노테이션이 붙어있는 메서드의 선언부가 상속받은 메서드와 다르다면 컴파일 오류가 발생하여 개발자의 실수를 막아 줄 수 있다.
  • 주로 사용하는 어노테이션은 아래와 같다.
어노테이션 설명
@Override 재정의된 메서드라는 정보 제공
@FunctionalInterface 함수형 인터페이스라는 정보 제공
@Deprecated 이후 버전에서 사용되지 않을 수 있는 변수, 메서드에 사용됨
@SuppressWarnings 특정 경고가 나타나지 않도록 

 

@Override 어노테이션의 내부

@Override 어노테이션의 내부를 한번 확인해보자.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

 

 

  • @Target 은 자바 컴파일러가 어노테이션이 어디에 적용될지 결정하기 위해 사용한다. 여기서 @Taget(ElementType.METHOD) 는 해당 어노테이션이 메서드에 적용될것을 명시한다.
  • ElementType : enum 타입으로 정의된 ElementType 의 value 중 하나를 선택해서 어노테이션 적용 대상을 명시해준다.
  • ElementType 의 내부 value 값들
    • TYPE : 클래스, 인터페이스(어노테이션이 포함된 인터페이스), enum, record 등 어노테이션이 선언된 타입 명시
    • FILED : 어노테이션이 선언된 필드 명시(enum 필드 포함)
    • METHOD : 어노테이션이 선언된 메서드 명시
    • PARAMETER : 어노테이션이 선언된 매개변수 명시
    • CONSTRUCTOR : 어노테이션이 선언된 생성자 명시
    • LOCAL_VARIABLE : 어노테이션이 선언된 지역변수 명시
    • ANNOTATION_TYPE : 어노테이션이 선언된 어노테이션 명시
    • 그 밖에도 PACKAGE, TYPE_PARAMETER, TYPE_USE, MODULE, RECORD_COMPONENT(jdk16) 등 다양하게 명시될 수 있는 value 값들이 존재한다.
  • @Retetion 은 어노테이션이 실제로 적용되고 유지되는 범위를 명시한다. 여기서 @Retention(RetentionPolicy.SOURCE) 는 해당 어노테이션이 소스코드 컴파일 전까지만 유효하게 적용된다는 것을 의미한다.
  • RetentionPolicy : enum 타입으로 정의된 RetentionPolicy 의 value 중 하나를 선택해서 @Retention(RetentionPolicy.SORCE) 와 같이 적용 범위를 명시해준다.
  • RetetionPolicy 의 내부 value 값들
    • RUNTIME : 어노테이션이 컴파일 이후에도 JVM에 의해 계속 참조된다. 주로 리플렉션이나 로깅에 많이 사용된다.
    • CLASS : 어노테이션이 컴파일러가 클래스를 참조할 때까지 적용된다.
    • SOURCE : 어노테이션이 컴파일 전까지만 유효하다. 즉, 컴파일 이후에는 사라지게 된다.

출처 : https://sanghye.tistory.com/39

 

[Spring] Meta Annotation 이란?(@Target, @Retention)

Spring 에서는 Anntotation 사용에 대한 기능을 상당히 많이 제공하고 있습니다. 주로 사용하는 @Controller, @Service, @Repostiroy 등 많은 Annotation 이 존재합니다. 해당 Annotion 은 각 기능에 필요한 만큼 많은

sanghye.tistory.com

 

추상 클래스

추상 클래스는 완성되지 않은 클래스로, 객체를 직접 생성할 수 없고 상속을 통해서만 사용되는 클래스이다.

추상 클래스는 항상 추상 메서드를 포함한다. 여기서 추상 메서드는 구현 코드가 없다. 즉, 자바에서 추상 메서드는 abstract 키워드를 사용하여 선언만 하는 메서드이다.

abstract class Cal{
    abstract int add(int x, int y);
}

 

 

위의 코드처럼 선언한 메서드를 보면 두 개의 정수를 입력받은 후 더해서 그 결과값을 반환한다는 것을 유추할 수 있다.

즉, 이 메서드의 선언부만 봐도 어떤일을 하는 메서드인지 알 수 있다는 것이다.

메서드의 선언부. 즉, 반환값, 메서드 이름, 매개변수를 정의한다는 것은 곧 메서드의 역할이 무엇인지, 어떻게 구현해야 하는지를 정의한다는 뜻이다.

따라서 메서드 몸체를 구현하는것 보다 중요한 것은 함수 선언부를 작성하는 것이다.

  • 추상 클래스는 new 키워드를 통해 객체를 만드는것이 불가능하다.
  • 추상 클래스를 상속받는 자식 클래스는 추상 클래스 내부에 선언된 추상 메서드를 모두 정의하거나 재정의하지 않으면(메서드 오버라이드 강제) 부모 클래스와 같은 추상 클래스가 된다.
  • 추상 메서드를 가지고 있지 않아도 추상 클래스로 선언할 수 있다. 
  • 추상 클래스에서 구현하는 메서드는 자식 클래스에서도 사용할, 즉 자식 클래스에서도 구현 내용을 공유할 메서드를 구현한다. 실제 자식 클래스에서 내용을 각각 다르게 구현해야 한다면, 구현 내용을 추상 메서드로 남겨두고 자식 클래스에 구현을 위임하는 것이다.
  • 자주 사용될 것이 예상되는 기능을 모아놓은 추상 클래스를 한번 만들어 놓으면 해당 클래스를 상속받는것으로 편하게 각종 기능들을 재사용함으로서 프로그램을 효율적으로 유지보수 할 수 있게된다. 

추상 클래스를 사용하는 경우

  • 객체로 존재하면 안되는 부모 클래스를 만들어야 하는 경우
  • 객체의 생성을 막아야 하는 경우
  • 공통 코드와 구현 강제를 통해 해당 클래스를 상속받는 자식 클래스들의 기능을 보장해줘야 하는 경우
  • 상속 구조의 기준점이 필요한 경우
  • 자식 클래스의 설계 실수를 막기 위해
  • 템플릿 구조를 만들기 위해