
안녕하세요! <코딩 자율학습 나도코딩의 자바 입문> 교재와 함께 진행하는 코딩학습단 21기, 이번 3주차(8장~10장 전반부) 학습을 성공적으로 마쳤습니다.
1~2주차 과정이 조건문, 반복문, 배열을 통해 프로그램의 ‘절차적 흐름’을 제어하는 방법을 배우는 단계였다면, 이번 3주차는 흩어진 로직들을 의미 있는 단위로 묶고 조립하는 객체지향 프로그래밍(OOP, Object-Oriented Programming)의 세계로 진입하는 중요한 기점이었습니다. 코드의 재사용성을 극대화하고, 유지보수를 용이하게 만드는 메서드와 클래스, 상속과 다형성의 개념을 실습한 5일간의 학습 기록을 구체적으로 정리해 봅니다.
11일차: 코드의 모듈화와 재사용성, 메서드 (8장 전반)
11일차에는 반복적으로 사용되는 코드 블록을 하나의 단위로 묶어내는 메서드(Method)를 학습했습니다. 프로그램의 규모가 커질수록 똑같은 로직을 중복해서 작성하는 것은 비효율적이므로, 이를 메서드로 분리하여 모듈화하는 과정이 필수적입니다.
- 매개변수(Parameter)와 전달값: 메서드 외부에서 내부로 연산에 필요한 데이터를 주입하는 방식을 익혔습니다. 변수의 타입과 개수를 명확히 지정하여 안전하게 데이터를 전달합니다.
- 반환값(Return): 메서드 내부의 연산 결과를 다시 호출한 곳으로 돌려주는 개념입니다. 단순히 콘솔에 출력하고 끝나는
void타입과 달리, 반환값이 있는 메서드는 그 결괏값을 변수에 담아 다른 연산에 2차, 3차로 재활용할 수 있다는 점에서 활용도가 매우 높습니다.
package chap_08;
public class _01_Method {
// 거듭제곱을 계산하여 정수로 반환하는 메서드 정의
public static int getPowerByExp(int number, int exponent) {
int result = 1;
for(int i = 0; i < exponent; i++) {
result *= number; // number를 exponent 횟수만큼 곱함
}
return result; // 최종 계산 결과를 반환
}
public static void main(String[] args) {
// 메서드 호출 및 반환값 활용
int retVal = getPowerByExp(3, 3);
System.out.println("3의 3승 연산 결과: " + retVal);
}
}12일차: 메서드 시그니처와 오버로딩 (8장 후반)
12일차에는 같은 이름의 메서드를 중복해서 정의할 수 있는 메서드 오버로딩(Method Overloading)과 변수의 생명 주기를 결정하는 사용 범위(Scope)를 다뤘습니다.
- 메서드 오버로딩: 자바 컴파일러는 메서드 이름뿐만 아니라 ‘매개변수의 타입과 개수’를 포함한 메서드 시그니처를 기준으로 메서드를 식별합니다. 따라서 정수를 받는
getPower(int)와 정수 두 개를 받는getPower(int, int)는 이름이 같아도 완전히 다른 메서드로 취급됩니다. 이를 통해 개발자는 기능이 유사한 메서드들의 이름을 하나로 통일하여 API의 일관성을 유지할 수 있습니다.
- 변수의 사용 범위: 중괄호
{}블록 내에서 선언된 지역 변수는 해당 블록을 벗어나는 순간 메모리에서 소멸된다는 점을 확인하며, 변수의 생명 주기와 메모리 관리의 기초 개념을 짚고 넘어갔습니다.
13일차: 객체지향의 뼈대, 클래스와 인스턴스 (9장 전반)
13일차는 자바의 정체성인 클래스(Class)와 객체(Object)의 구조를 설계하는 단계였습니다. 데이터(변수)와 기능(메서드)을 하나의 설계도 안에 정의하고, 이를 실체화하여 사용하는 방법을 실습했습니다.
- 인스턴스(Instance) 변수:
new키워드를 통해 클래스가 메모리(Heap 영역)에 할당되어 실체화된 것을 객체(인스턴스)라고 합니다. 객체마다 고유하게 가지는 상태 값이 바로 인스턴스 변수입니다.
- 클래스(Static) 변수: 객체 생성 없이 클래스명으로 직접 접근할 수 있으며, 해당 클래스로 생성된 모든 객체가 메모리 공간을 공유하는 변수입니다. 블랙박스 예제에서 모든 기기의 ‘자동 신고 기능’을 일괄적으로 ON/OFF 할 때
static변수가 얼마나 강력하게 작용하는지 코드로 체감했습니다.
package chap_09;
public class BlackBox03 {
String modelName; // 인스턴스 변수: 객체(b1, b2)마다 독립적인 공간 할당
static boolean canAutoReport = false; // 클래스 변수: 모든 객체가 하나의 값을 공유
}14일차: 데이터 무결성을 위한 캡슐화와 접근 제어 (9장 후반)
14일차는 객체지향 설계에서 가장 중요한 원칙 중 하나인 데이터 보호(Encapsulation) 기법을 집중적으로 학습했습니다.
- 생성자(Constructor)와
this: 객체가 생성될 때 단 한 번 호출되는 생성자를 통해 필수 데이터를 초기화하는 과정을 실습했습니다. 특히, 인스턴스 변수와 매개변수의 이름이 같을 때 모호성을 해결하기 위해 자기 자신의 참조값을 가리키는this.키워드를 명시적으로 사용하는 규칙을 익혔습니다.
- 접근 제어자 (Access Modifier): 클래스의 자원(변수, 메서드)에 대한 외부 접근을 통제하는 4가지 레벨(
public,protected,default,private)을 비교했습니다.
- Getter와 Setter의 필요성: 인스턴스 변수를
private으로 선언하여 외부의 직접 접근을 차단하고,public으로 열려 있는 메서드(Getter/Setter)를 통해서만 데이터를 조작하도록 통제합니다. 가격을 설정하는setPrice()메서드 내부에서if (price < 100000)조건문을 통해 유효하지 않은 값(비정상적인 할인이나 음수)이 시스템에 입력되는 것을 원천 차단하는 로직을 구현해 보았습니다.
15일차: 코드 확장의 무기, 상속과 다형성 (10장 전반)
3주차 마지막 날인 15일차에는 기존 클래스의 코드를 재사용하고 확장하는 상속(extends)과 객체지향의 꽃이라 불리는 다형성(Polymorphism)을 실습했습니다.
- 상속과 오버라이딩(Overriding): 공통 기능(사진 촬영, 녹화)은 부모 클래스인
Camera에 한 번만 작성하고, 자식 클래스(FactoryCam,SpeedCam)들은 이를 물려받아 재사용합니다. 또한, 부모가 물려준 메서드를 자식의 목적에 맞게 재정의하는 오버라이딩을 학습했으며, 컴파일러에게 오버라이딩을 명확히 알리는@Override어노테이션의 역할을 확인했습니다.
- 다형성과 형변환(Casting): 부모 타입의 배열 하나로 다양한 자식 객체들을 묶어서 관리하는 다형성을 실습했습니다. 공통 기능은 부모 타입에서 일괄 실행하고, 자식 클래스 고유의 기능(예: 화재 감지)을 실행할 때는
instanceof연산자로 실제 객체 타입을 안전하게 검증한 뒤, 자식 타입으로 다운캐스팅(Downcasting)하여 호출하는 정교한 컨트롤 방식을 익혔습니다.
super키워드: 자식 클래스에서 부모 클래스의 메서드나 생성자를 명시적으로 호출할 때 사용합니다. 오버라이딩 시 부모의 기존 로직을 완전히 덮어쓰지 않고super.recordVideo()로 먼저 실행한 뒤, 자식만의 추가 로직을 결합하는 방식으로 코드 중복을 최소화했습니다.
package chap_10.camera;
// 다형성 실습: 여러 종류의 카메라(자식)를 하나의 부모 타입 배열로 관리
Camera03[] cameras = new Camera03[3];
cameras[0] = new Camera03();
cameras[1] = new FactoryCam03(); // 공장 카메라
cameras[2] = new SpeedCam03(); // 과속 단속 카메라
System.out.println("--- 자식 클래스의 고유 기능 사용하기 ---");
for(Camera03 cam : cameras) {
// instanceof 연산자를 이용한 안전한 다운캐스팅 검증
if(cam instanceof FactoryCam03) {
((FactoryCam03) cam).detectFire();
} else if (cam instanceof SpeedCam03) {
((SpeedCam03) cam).checkSpeed();
((SpeedCam03) cam).recognizeLicensePlate();
}
}3주차 마무리 총평
이번 3주차 학습을 통해 ‘절차적으로 코드를 나열하는 것’과 ‘객체들의 상호작용으로 시스템을 설계하는 것’의 근본적인 차이를 이해할 수 있었습니다.
클래스로 데이터의 구조를 잡고, 접근 제어자와 Getter/Setter로 데이터의 무결성을 방어하며, 상속과 다형성을 이용해 유연하고 확장 가능한 설계를 하는 일련의 과정은 실제 소프트웨어 아키텍처를 구축하는 데 없어서는 안 될 핵심 지식입니다. 다양한 카메라를 부모-자식 관계로 묶어보는 실습을 통해 다형성(IS-A 관계)의 작동 원리를 깊이 있게 체화할 수 있었습니다.
자바 프로그래밍의 첫 번째 진입장벽으로 불리는 객체지향 파트였지만, 직관적인 예제와 함께 직접 코드를 타이핑하며 완주해 낸 것에 큰 보람을 느낍니다. 이번 주에 튼튼하게 다진 구조적 뼈대를 바탕으로 남은 과정도 포기하지 않고 끝까지 밀도 있게 학습해 나가겠습니다!
