[Java] 객체지향 복습 (6장~10장)

icehugger·2026년 4월 8일

training

목록 보기
1/8

신입 연수 1주차, 오늘은 Java의 핵심인 객체지향 파트를 집중적으로 팠습니다. 예전에 학원에서 배웠지만 막연하게만 알고 있었던 부분들중, 연수 받으며 새롭게 깨달은 부분들을 정리해 봅니다.

1. API

그동안 저에게 API란 Google Maps나 기상청 API처럼 외부 서버에서 데이터를 가져오는 것들뿐이었습니다. 하지만 오늘 Java의 표준 라이브러리(java.util, java.lang 등) 자체가 Java API라는 것을 처음 제대로 알게 되었습니다.

깨달은 점: 프로그램과 프로그램, 혹은 프로그램과 운영체제 사이의 '창구' 역할을 하는 모든 인터페이스가 API라는 점. API(Application Programming Interface) 인터페이스인걸 까먹지 말자!!

2. 패키지와 물리적 디렉토리의 관계

IDE(IntelliJ 등)를 쓸 때는 패키지를 만들면 자동으로 폴더가 생성되어 무심코 지나쳤던 부분입니다. 직접 폴더를 만들며 작업해 보니 패키지 선언과 물리적 폴더 구조가 반드시 일치해야 한다는 원칙을 다시금 되새길 수 있었습니다.

망각했던 부분: package com.hy;라고 선언했다면, 실제 파일은 com/hy라는 폴더 안에 있어야 하며, 컴파일 시 -d . 옵션 등을 통해 이 구조를 유지해야 한다는 점을 복습했습니다.

3. static 메서드 vs 인스턴스 메서드

'인스턴스 필드에 있는 메서드에는 static을 붙이지 않는다'는 사실을 잠시 잊고 있었습니다.

다시 잡은 개념: static은 클래스 레벨에서 공유되는 것(설계도 자체의 기능).

static이 없는 메서드는 반드시 new를 통해 생성된 객체(인스턴스)를 통해서만 호출할 수 있다는 점.

메모리에 올라가는 시점과 방식이 다르기 때문에 혼용해서 쓰면 에러가 난다는 것을 실습을 통해 확인했습니다.

4. 생성자(Constructor)의 규칙

학원 프로젝트 때는 습관적으로 getter/setter와 함께 만들던 생성자였는데, 이번에 그 정의 조건을 정확히 정리했습니다.

새로 알게 된 사실: 생성자는 오직
1. 클래스 이름과 동일해야 함
2. 반환 타입(void 포함)을 절대 적지 않음
이 두 가지 조건을 만족해야만 자바가 '생성자'로 인식한다는 점입니다. 이 규칙 덕분에 객체 생성 시 자동 호출이 가능해진다는 메커니즘이 흥미로웠습니다.

5. this()와 super(): 생성자 체이닝

오버로딩된 다른 생성자를 호출할 때 쓰는 this()와 부모 생성자를 호출하는 super()에 대해 공부했습니다.

몰랐던 부분:

this()를 통해 자기 자신의 다른 생성자를 호출하여 중복 코드를 줄일 수 있다는 점.

부모 클래스에 인자가 있는 생성자만 있을 경우, 자식 클래스에서 반드시 super(인자)를 명시해야 에러가 나지 않는다는 점.

super는 직속 부모만 가리키며, super.super처럼 조부모 클래스에 직접 접근하는 것은 불가능하다는 자바의 설계 원칙(캡슐화)을 새로 알게 되었습니다.

6. 상속의 제약: final 키워드

상속을 무조건 좋다고 생각했는데, 막아야 할 때도 있다는 것을 배웠습니다.

클래스 앞에 final이 붙으면 상속 불가(예: String 클래스).

메서드 앞에 final이 붙으면 자식 클래스에서 오버라이딩 불가.

보안과 설계의 일관성을 위해 'final'을 선언 한다는것을 알게 되었습니다.

7. 설계의 핵심: is-a vs has-a

단순히 코드 복사를 줄이려고 상속을 쓰는 게 아니라, 논리적 관계를 따져야 한다는 점이 중요

is-a (상속): "Hero is a human"처럼 하위 개념일 때.

has-a (포함): "Hero has a sword"처럼 부품으로 쓸 때.

오늘의 한 줄 평: > 감기가 씨게 왔는데도 불구하고 열심히 공부했다. 아는 줄 알았는데 모르고 있었던 것들이 참 많았다. 그래도 대충이라도 알고 다시 기본으로 돌아가서 하는 공부가 생각보다 재밌다.

0개의 댓글