CodeGym /행동 /JAVA 25 SELF /클래스 구조: 필드, 메서드, 생성자

클래스 구조: 필드, 메서드, 생성자

JAVA 25 SELF
레벨 14 , 레슨 2
사용 가능

1. 클래스의 필드: 객체 상태를 어디에 저장하나요

필드란 클래스 내부(모든 메서드 밖)에 선언되는 변수입니다. 필드는 각 객체가 고유한 “상태”를 갖도록 해 줍니다. 예를 들어 클래스 Person이 있다면 필드는 다음과 같을 수 있습니다:

  • name — 사람의 이름
  • age — 나이
  • balance — 계좌 잔액(은행 앱을 만든다고 가정할 때)
  • isStudent — 학생인지 여부를 나타내는 플래그

필드 선언 문법

필드 선언은 일반 변수 선언과 비슷하지만, 메서드 내부가 아니라 클래스 본문에 위치합니다:

public class Person {
    String name;
    int age;
}

여기서는 두 개의 필드를 선언했습니다: 문자열 name과 정수 age. 각 필드는 이 클래스의 특정 객체에 속합니다. 즉, 서로 다른 객체는 서로 다른 값을 갖습니다. 예:

Person p1 = new Person();
p1.name = "Olya";
p1.age = 20;

Person p2 = new Person();
p2.name = "Igor";
p2.age = 25;

첫 번째 객체의 이름은 “Olya”, 나이는 20이고, 두 번째 객체의 이름은 “Igor”, 나이는 25입니다. 둘 다 같은 클래스로 만들어졌지만, 각 객체의 필드에는 서로 다른 데이터가 저장됩니다.

접근 제어자 (public/private)

필드는 공개(public)일 수도 있고 비공개(private)일 수도 있습니다. 현실에서도 누구에게나 자신의 은행 잔액을 공개하진 않죠? 마찬가지로 프로그래밍에서도 다른 클래스에서 직접 접근하지 못하도록 필드를 private으로 두는 경우가 많습니다. 이는 캡슐화 원칙의 일부입니다(자세한 내용은 다음 수업에서 다룹니다).

예:

public class Person {
    private String name;
    private int age;
}

지금은 복잡하게 다루지 않겠지만 기억해 두세요: 필드가 private이면 다른 클래스에서 직접 접근할 수 없습니다.

2. 클래스의 메서드: 객체가 “어떻게 동작”하나요

메서드는 객체의 행동을 설명하는 함수입니다. 메서드는 객체가 말하기, 계산하기, 달리기, 점프하기, 자기 정보를 출력하기 등 무엇인가를 할 수 있게 합니다.

메서드 선언 문법

tip_vozvrashchayemogo_znacheniya imyaMetoda(parametry) {
    // 메서드 본문
}

“안녕하세요”라고 말하는 메서드 예:

public void sayHello() {
    System.out.println("안녕하세요! 제 이름은 " + name);
}

설명:

  • public — 접근 제어자.
  • void — 값을 반환하지 않는 메서드입니다(무언가를 수행만 함).
  • sayHello — 메서드 이름.
  • 메서드 내부에서 필드 name을 사용해 인사 메시지를 출력합니다.

또 다른 예: 나이를 반환하는 메서드

public int getAge() {
    return age;
}

메서드는 값을 반환할 수도 있습니다(int, String 등). 또는 아무 것도 반환하지 않을 수도 있는데, 그럴 때는 void를 씁니다.

3. 생성자: 객체가 “태어나는” 방법

생성자는 새 객체를 만들 때 호출되는 특별한 메서드입니다. 생성자의 역할은 객체의 필드를 초기값으로 채우는 것입니다. 예를 들어 사람의 이름과 나이를 객체 생성 시점에 바로 지정해 비어 있지 않도록 하는 것입니다.

  • 생성자 이름은 항상 클래스 이름과 같습니다.
  • 생성자는 반환 타입이 없습니다(심지어 void도 쓰지 않습니다).
  • 생성자는 매개변수를 받을 수도 있고(예: 이름, 나이), 매개변수가 없을 수도 있습니다.

생성자 예

public class Person {
    String name;
    int age;

    // 매개변수 두 개가 있는 생성자
    public Person(String name, int age) {
        this.name = name; // this.name는 객체의 필드, name은 생성자의 매개변수
        this.age = age;
    }
}

아마 this가 무엇인지 궁금했을 겁니다. this는 현재 객체 자신을 가리키는 키워드입니다. 같은 이름의 필드와 매개변수를 구분하기 위해 사용합니다. this가 없으면 컴파일러는 무엇을 초기화하려는지 헷갈릴 수 있습니다.

기본 생성자

아무 생성자도 선언하지 않으면 Java 컴파일러가 자동으로 매개변수가 없는 기본 생성자를 추가합니다. 모양은 다음과 같습니다:

public Person() {
    // 아무 것도 하지 않지만, 매개변수 없이 객체를 만들 수 있게 해 준다
}

주의! 매개변수가 있는 생성자를 하나라도 선언하면 기본 생성자는 더 이상 자동으로 만들어지지 않습니다. 기본 생성자가 필요하다면 명시적으로 작성하세요.

4. 완성된 클래스 예시

이제 필드, 메서드, 생성자를 모두 합쳐 보겠습니다.

public class Person {
    String name;
    int age;

    // 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 메서드: 인사하기
    public void sayHello() {
        System.out.println("안녕하세요! 제 이름은 " + name + "이고, 저는 " + age + "살입니다.");
    }

    // 메서드: 나이를 1 증가시키기
    public void haveBirthday() {
        age = age + 1;
        System.out.println("와! 이제 " + age + "살이 되었어요!");
    }
}

프로그램에서 어떻게 사용할까요?

public class Main {
    public static void main(String[] args) {
        Person vasya = new Person("Vasya", 18);
        vasya.sayHello();      // 안녕하세요! 제 이름은 Vasya이고, 저는 18살입니다.
        vasya.haveBirthday();  // 와! 이제 19살이 되었어요!
    }
}

5. 실습: 여러분의 애플리케이션 발전시키기

여러분이 간단한 사용자 관리 애플리케이션을 만든다고 가정해 봅시다. 이전 수업에서는 main 내부에서 변수와 메서드만 사용했습니다. 이제 필드, 메서드, 생성자를 갖는 자체 클래스 User를 만들어 보겠습니다.

public class User {
    String username;
    int score;

    // 생성자
    public User(String username, int score) {
        this.username = username;
        this.score = score;
    }

    // 메서드: 사용자 정보 출력
    public void printInfo() {
        System.out.println("사용자 이름: " + username + ", 점수: " + score);
    }

    // 메서드: 점수 증가
    public void addScore(int points) {
        score += points;
        System.out.println(username + "의 점수가 " + points + "점 증가했습니다! 이제 " + score + "점입니다.");
    }
}

사용 방법:

public class Main {
    public static void main(String[] args) {
        User alice = new User("Alice", 10);
        User bob = new User("Bob", 5);

        alice.printInfo(); // 사용자 이름: Alice, 점수: 10
        bob.printInfo();   // 사용자 이름: Bob, 점수: 5

        alice.addScore(7); // Alice의 점수가 7점 증가했습니다! 이제 17점입니다.
        bob.addScore(3);   // Bob의 점수가 3점 증가했습니다! 이제 8점입니다.
    }
}

주의: 각 객체는 자신의 필드를 가지며, 한 객체의 변경은 다른 객체에 영향을 주지 않습니다.

6. 접근 제어자 간단 정리

위의 예시들에서는 필드가 공개되어 있었습니다(String name;). 실제로는 다른 클래스에서 임의로(혹은 실수로) 변경하지 못하게 하려고 필드를 private으로 두는 경우가 많습니다. 자세한 내용은 캡슐화 주제에서 다루겠지만, 아래는 간단한 예입니다:

public class User {
    private String username;
    private int score;

    public User(String username, int score) {
        this.username = username;
        this.score = score;
    }

    public void printInfo() {
        System.out.println("사용자 이름: " + username + ", 점수: " + score);
    }

    public void addScore(int points) {
        score += points;
    }
}

이제 누군가가 클래스 밖에서 alice.score = 100500;처럼 작성하면 — 컴파일러가 “허용되지 않습니다!”라고 할 것입니다.

7. 필드, 메서드, 생성자에서 흔한 실수

오류 №1: 초기화되지 않은 필드.
필드에 값을 지정하지 않으면 기본값을 받습니다. 숫자 — 0, booleanfalse, 참조형(예: String) — null. 필드 초기화를 잊으면 예상치 못한 결과가 나오거나, 해당 필드를 사용하려다 NullPointerException이 발생할 수 있습니다.

오류 №2: 매개변수와 필드를 혼동.
생성자에서 초보자가 자주 쓰는 name = name; 같은 코드는 필드를 초기화하지 않고 매개변수에 자기 자신을 대입할 뿐입니다. 항상 this.name = name을 사용하세요!

오류 №3: 기본 생성자가 없음.
매개변수가 있는 생성자를 선언해 놓고 기본(빈) 생성자를 명시적으로 추가하지 않으면, new Person()는 더 이상 동작하지 않습니다.

오류 №4: 메서드 이름과 클래스 이름을 동일하게 사용.
Java에서는 생성자 이름이 클래스 이름과 반드시 같아야 하지만, 메서드 이름은 그래서는 안 됩니다. 실수로 메서드 이름을 클래스 이름과 똑같이 지으면 컴파일 오류가 발생합니다.

오류 №5: 접근 제어자를 잊음.
필드를 public으로 두면 어디서나 변경할 수 있어 — 규모가 큰 프로그램에서는 매우 위험합니다. 처음부터 private에 익숙해지고, 접근을 위해 메서드를 사용하는 습관을 들이세요.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION