TIL/[TIL]

[TIL]추상화, DTO, 생성자, 메서드 매개변수와 오버로딩

namerong 2026. 5. 4. 14:11

1. 학습 주제

객체지향의 핵심 개념을 조금 더 구체적으로 정리했다.
자동차 예제를 통해 추상화와 객체 간 협력 방식을 이해했고, DTO와 생성자를 사용해 데이터를 다루는 구조를 익혔으며, 메서드의 매개변수 전달 방식과 오버로딩 규칙까지 함께 확인했다.

  • 추상화와 객체 간 메시지 전달 이해하기
  • DTO 객체에 데이터 담고 꺼내기
  • 생성자의 역할과 this, this() 사용법 익히기
  • 기본 자료형과 참조 자료형의 매개변수 전달 차이 이해하기
  • 가변 인자 문법 사용하기
  • 메서드 오버로딩의 규칙 정리하기

2. 추상화

추상화는 복잡한 내부 구현을 모두 드러내기보다, 필요한 기능 중심으로 객체를 다루는 방식이다.
자동차 예제에서는 사용자가 직접 Car를 조작하지 않고, CarRacer에게 명령을 전달하는 구조로 표현되어 있었다.

CarRacer racer = new CarRacer();
racer.startUp();
racer.stepAccelator();
racer.stepBreak();
racer.turnOff();
  • 사용자는 자동차 내부 동작을 모두 알 필요가 없다.
  • 필요한 기능만 메서드 형태로 요청하면 된다.
  • 객체지향에서는 이런 식으로 역할을 나누고 메시지를 전달한다.

CarRacer는 자동차를 직접 소유하고 있다.

private final Car myCar = new Car();
  • CarRacer와 Car는 has-a 관계로 볼 수 있다.
  • 레이서는 차에게 “시동 걸기”, “출발”, “정지”를 요청할 뿐이다.
  • 실제 동작은 Car 객체 내부에서 처리한다.

3. Car 클래스의 상태와 동작

Car 클래스는 상태와 기능을 함께 가진 객체로 구성되어 있었다.

private boolean isOn;
private int speed;
  • isOn은 시동 상태를 의미한다.
  • speed는 현재 속도를 의미한다.
  • 객체는 이런 상태값과 메서드를 함께 가진다.

메서드 안에서는 현재 상태에 따라 동작이 달라진다.

public void go() {
    if (isOn) {
        this.speed += 10;
    } else {
        System.out.println("시동을 먼저 걸어주세요.");
    }
}
  • 시동이 걸려 있어야 출발할 수 있다.
  • 속도가 있는 상태에서는 바로 시동을 끌 수 없도록 막을 수도 있다.
  • 객체는 자신의 상태를 기준으로 스스로 판단하며 동작한다.

4. DTO

DTO는 데이터를 담아서 전달하기 위한 객체이다.
MemberDTO 예제에서는 필드를 private으로 감추고, getter와 setter를 통해 값에 접근하는 구조를 사용했다.

MemberDTO member = new MemberDTO();

member.setNumber(1);
member.setName("홍길동");
member.setAge(20);
  • DTO는 데이터를 저장하고 전달하는 용도로 많이 사용된다.
  • 필드는 외부에서 직접 접근하지 않고 메서드를 통해 다룬다.
  • 필요한 값을 하나의 객체로 묶어 관리할 수 있다.

불리언 필드는 is 형태의 getter를 사용한다는 점도 확인할 수 있었다.

public boolean isActivated() {
    return isActivated;
}
  • boolean 타입은 getActivated() 대신 isActivated()처럼 작성하기도 한다.
  • 자바빈 규칙에서 자주 보이는 형태이다.

5. 생성자

생성자는 객체가 만들어질 때 가장 먼저 호출되는 초기화 메서드이다.

User user = new User();
User user1 = new User("user02", "pass02", "홍길동");
  • new 연산자로 객체를 만들 때 생성자가 호출된다.
  • 객체 생성과 동시에 필드 초기화를 도와준다.
  • 필요한 값이 있다면 생성자 매개변수로 받아 바로 저장할 수 있다.

생성자 작성 규칙도 확인했다.

  • 이름은 클래스명과 같아야 한다.
  • 반환 타입을 작성하지 않는다.
  • 객체 생성 시 단 한 번 호출된다.

6. this와 this()

생성자에서는 this와 this()를 함께 사용할 수 있다.

public User(String id, String pwd, String name) {
    this.id = id;
    this.pwd = pwd;
    this.name = name;
}
  • this는 현재 생성된 객체 자기 자신을 의미한다.
  • 매개변수와 필드 이름이 같을 때 구분하는 데 자주 사용한다.

또 다른 생성자를 호출할 때는 this()를 사용한다.

public User(String id, String pwd, String name, Date enrollDate) {
    this(id, pwd, name);
    this.enrollDate = enrollDate;
}
  • 같은 클래스 안의 다른 생성자를 재사용할 수 있다.
  • 중복 코드를 줄일 수 있다.
  • this()는 생성자 내부 첫 줄에서만 사용할 수 있다.

7. 매개변수 전달 방식

메서드에 값을 전달할 때 기본 자료형과 참조 자료형은 체감상 다르게 보인다.

7.1 기본 자료형

public void testPrimitiveType(int num) {
    num = 99;
}
  • 기본 자료형은 값 자체가 복사되어 전달된다.
  • 메서드 안에서 값을 바꿔도 원본 변수에는 영향이 없다.

7.2 배열

public void testArrayParameter(int[] arr) {
    arr[0] = 99;
}
  • 배열은 참조 자료형이므로 주소값이 전달된다.
  • 같은 배열을 바라보므로 내부 요소를 수정하면 원본에도 반영된다.

7.3 객체

public void testObjectParameter(Rectangle rect) {
    rect.setWidth(100);
}
  • 객체도 참조 자료형이므로 주소값이 전달된다.
  • 메서드 안에서 객체 상태를 바꾸면 원본 객체도 변경된다.

8. 가변 인자

가변 인자는 매개변수 개수가 고정되지 않을 때 사용할 수 있다.

public void orderPizza(String customerName, String... toppings) {
    System.out.println(Arrays.toString(toppings));
}
  • String... toppings처럼 작성한다.
  • 메서드 내부에서는 배열처럼 다룰 수 있다.
  • 토핑 개수가 0개여도 되고 여러 개여도 된다.
pt.orderPizza("김문어");
pt.orderPizza("김문어", "불고기");
pt.orderPizza("김문어", "불고기", "치즈", "올리브");
  • 호출할 때 전달 개수를 자유롭게 바꿀 수 있어 편리하다.

9. 오버로딩

오버로딩은 같은 이름의 메서드를 여러 개 정의하는 기술이다.

public int add(int num1, int num2) { ... }
public double add(double num1, double num2) { ... }
public int add(int num1, int num2, int num3) { ... }
  • 메서드 이름은 같아도 된다.
  • 대신 매개변수의 타입, 개수, 순서가 달라야 한다.
  • 상황에 따라 같은 이름으로 비슷한 기능을 제공할 수 있다.

BadCalculator처럼 이름을 전부 다르게 짓는 방식보다, Calculator처럼 같은 이름으로 묶는 쪽이 훨씬 자연스럽다.


10. 오버로딩 성립 조건

메서드 시그니처는 메서드 이름 + 매개변수 타입/개수/순서로 결정된다.

public void test() {}
public void test(int num) {}
public void test(String str) {}
public void test(int num, String str) {}
public void test(String str, int num) {}
  • 매개변수 개수가 다르면 오버로딩이 성립한다.
  • 매개변수 타입이 다르면 성립한다.
  • 매개변수 순서가 다르면 성립한다.

반대로 아래 경우는 성립하지 않는다.

  • 반환 타입만 다른 경우
  • 접근 제한자만 다른 경우
  • 매개변수 이름만 다른 경우

즉, 자바는 메서드를 구분할 때 이름과 매개변수 구조를 본다는 점이 중요하다.


11. 흐름 정리

11.1 객체지향 설계

  • 추상화를 통해 필요한 기능 중심으로 객체를 다루기
  • 객체 간 메시지 전달 방식 이해하기
  • DTO를 이용해 데이터를 한 객체로 묶어 전달하기

11.2 객체 생성과 메서드 활용

  • 생성자로 객체 초기화하기
  • this, this()로 코드 중복 줄이기
  • 기본 자료형과 참조 자료형의 전달 차이 이해하기
  • 가변 인자로 유연한 메서드 만들기
  • 오버로딩으로 같은 이름의 메서드 확장하기

12. 핵심 정리

  1. 추상화는 복잡한 내부 구현을 숨기고 필요한 기능만 드러내는 방식이다.
  2. 객체는 자신의 상태와 동작을 함께 가지며, 다른 객체와 메시지를 주고받으며 협력한다.
  3. DTO는 데이터를 담아 전달하기 위한 객체이다.
  4. 생성자는 객체 생성 시 가장 먼저 호출되는 초기화 메서드이다.
  5. this는 현재 객체를 가리키고, this()는 같은 클래스의 다른 생성자를 호출한다.
  6. 기본 자료형은 값이 복사되어 전달되므로 원본이 바뀌지 않는다.
  7. 배열과 객체는 참조 자료형이므로 내부 상태를 바꾸면 원본에도 영향이 간다.
  8. 가변 인자는 매개변수 개수를 유연하게 받을 수 있게 해준다.
  9. 오버로딩은 같은 이름의 메서드를 매개변수 구조만 다르게 여러 개 만드는 기술이다.
  10. 반환 타입만 다르다고 해서 오버로딩이 되는 것은 아니다.