[Java] class 간단 용어 정리 (+ 접근 제어자, this)

Hood·2025년 10월 17일

Java

목록 보기
4/5
post-thumbnail

들어가기 전

객체 지향 프로그래밍을 하다보면 객체를 class로 정의하며 설계도를 만들고
이것을 가지고 여러 객체를 생성하여 사용하는 식으로 프로그래밍을 이어갑니다.
클래스를 생성자 오버로드(new)를 통해 사용하다 보니 class 안에 this 키워드가
정확히 무엇인지 확인하고 싶어졌습니다. 이에 알아보려 합니다.


class 용어 정리

자바에서 클래스(class)는 객체를 정의하는 설계도와 같습니다.
자바는 이 설계도를 가지고 여러 객체를 생성하며 사용하는 식의 프로그래밍을 하며
클래스는 객체의 속성 변수를 나타내는 field, 객체의 함수를 나타내는 method 로 구성됩니다.

그리고 클래스를 사용하다보면 객체, 인스턴스, 메서드, 필드 등의 용어가 나왔는데
이를 하나씩 집고 넘어가봅시다.

객체 : 객체 지향 프로그래밍의 대상
클래스 : 객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스 : 클래스가 메모리에 생성된 상태
멤버 변수 : 클래스의 속성, 특성
메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현
참조 변수 : 메모리에 생성된 인스턴스를 가르키는 변수
참조 값 : 생성된 인스턴스의 메모리 주소 값
생성자 : 클래스를 생성할 때 사용되는 함수 (new 생성자)
생성자 오버로드 : 클래스에 생성자가 두 개 이상 제공되는 경우

이것을 말로 설명하면 조금 혼용될 수 있으니 아래의 코드 예시를 들어봅시다.

// '클래스' : Person 이라는 이름의 클래스를 정의합니다. 객체를 만들기 위한 설계도입니다.
class Person {
    // '멤버 변수' : 클래스의 속성을 나타냅니다. (이름, 나이)
    String name;
    int age;

    // '생성자' : 이름과 나이를 받아 객체를 초기화합니다.
    public Person(String name, int age) {
        this.name = name; // this는 현재 인스턴스를 가리킵니다.
        this.age = age;
        System.out.println("Person(이름, 나이) 생성자 호출됨!");
    }

    // '생성자 오버로드' : 이름만 받는 생성자를 추가로 정의합니다. 나이는 1살로 기본 설정됩니다.
    public Person(String name) {
        this(name, 1); // 첫 번째 생성자를 재사용합니다.
        System.out.println("Person(이름) 생성자 호출됨!");
    }

    // '메서드' : 멤버 변수를 사용하여 자기소개 기능을 구현합니다.
    public void introduce() {
        System.out.println("안녕하세요. 제 이름은 " + name + "이고, 나이는 " + age + "살입니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // '객체', '인스턴스' 생성
        // new Person("이순신", 30) 코드를 통해 Person 클래스의 '인스턴스'(객체)가 메모리에 생성됩니다.
        // personLee은 '참조 변수'이고, 이 변수에는 생성된 인스턴스의 메모리 주소('참조 값')가 저장됩니다.
        Person personLee = new Person("이순신", 30); // '생성자' Person(String, int) 호출

        // 생성자 오버로드를 사용한 두 번째 인스턴스 생성
        Person personSe = new Person("세종대왕"); // '생성자' Person(String) 호출

        // 각 인스턴스의 메서드 호출
        System.out.println("\n--- 자기소개 시작 ---");
        personLee.introduce(); // personLee 인스턴스의 introduce 메서드 실행
        personSe.introduce(); // personSe 인스턴스의 introduce 메서드 실행

        System.out.println("\n--- 참조 값 확인 ---");
        // 참조 변수 person1은 인스턴스의 주소 값을 가짐 (예: Person@1b6d3586)
        System.out.println("personLee 참조 변수가 가리키는 값: " + personLee);
        System.out.println("personSe 참조 변수가 가리키는 값: " + personSe);
    }
}

접근 제어자

클래스의 멤버 변수를 public으로 사용하다보면 접근이 제한되지 않으므로 정보의 오류가
발생할 수 있습니다. 이를 위해 정보 은닉이 필요한 변수나 메서드는 private로 선언해줘야하며
또 모든 변수를 private로 선언해야 하는 것은 아니지만 필요한 경우에 오류를 막을 수 있습니다.

자바에서 사용하는 접근 제어자를 정리하면 다음과 같습니다.

접근 제어자설명
public외부 클래스 어디에서나 접근할 수 있습니다.
protected같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고 그 외 클래스는 접근할 수 없습니다.
아무것도 없는 경우default이며 같은 패키지 내부에서만 접근할 수 있습니다.
private같은 클래스 내부에서만 접근할 수 있습니다.

this?

자신의 메모리를 가르키는 this

위의 예시에서 this 키워드를 발견했을 겁니다.
this를 간단히 설명하면 생성된 인스턴스 스스로를 가르키는 예약어입니다.
예시를 통해 알아봅시다.

package exClass;

public class BirthDay {
    int day;
    int month;
    int year;

    public void getYear(int year){
        this.year = year;
    }

    public void printThis(){
        System.out.println(this);
    }


    public static void main(String[] args){
        BirthDay bDay = new BirthDay();
        bDay.getYear(2000);
        System.out.println(bDay); // 출력 exClass.BirthDay@메모리주소
        bDay.printThis(); // 출력 exClass.BirthDay@메모리주소
    }
}

인스턴스를 가리키는 변수가 참조변수이며
참조 변수를 출력하면 클래스이름@메모리 주소 문자열 값이 나옵니다.
따라서 bDay 변수와 bDay.printThis() 메서드가 결과가 같으며
클래스에서 사용하는 this는 생성된 자신을 가르키는 역할을 한다는 것을 알 수 있습니다.
따라서 this.year = year; 문장으로 참조하면 동적 메모리에 생성된 인스턴스의 year 변수
위치를 가르키며 그 위치에 매개변수 값을 넣어주는 것이라고 생각하면 됩니다.

생성자에서 다른 생성자를 호출하는 this

클래스에 생성자가 여러 개 있을 때 어떤 생성자에서 다른 생성자를 호출하는 경우가 종종 있습니다. 이때 this를 사용해 클래스의 생성자에서 다른 생성자를 호출할 수 있습니다.

class Person {
    String name;
    int age;

    Person(){
        this("noname", 1);
    }

    Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        Person noName = new Person();
        System.out.println(noName.name); //출력 : noname
        System.out.println(noName.age);  //출력 : 1
}

Person 클래스에서 Person() 디폴트 생성자와 매개변수를 가지는 Person(String, int)
생성자가 있습니다. 클래스가 생성될 때 Person(String, int)가 호출되어 이름과
나이를 전달받고 Person() 디폴트 생성자가 호출되는 경우에는 초깃값으로
"noname", 1 값을 대입하고자 합니다. 디폴트 생성자 코드 안에서 직접 써도 되지만
이미 다른 생성자에 이 코드가 작성되었으므로 this를 활용하여 다른 생성자를 호출할 수 있습니다.

하지만 생성자는 클래스가 생성될 때 호출되므로 클래스 생성이 완료되지 않은 시점에서는
다른 코드가 있다면 오류가 발생할 수 있습니다.
그래서 this를 활용한 문장은 가장 먼저 와야 합니다.

자신의 주소를 반환하는 this

마지막으로 this를 사용하여 생성된 클래스 자신의 주소 값을 반환할 수 있습니다.
인스턴스 주소 값을 반환할 때는 this를 사용하고 반환형은 클래스 자료형을 사용합니다.
this 메서드를 반환하는 일은 흔하지 않지만 클래스내에서 this를 사용하면 자신의 값을
반환할 수 있습니다.

class Person {
    String name;
    int age;

    Person(){
        this("noname", 1);
    }

    Person(String name, int age){
        this.name = name;
        this.age = age;
    }


	Person resultItSelf(){ //반환형은 클래스형
    	return this
    }
    public static void main(String[] args) {
        Person noName = new Person();
        System.out.println(noName.name); //출력 : noname
        System.out.println(noName.age);  //출력 : 1
        
        Person p = noName.resultItSelf(); // this 값을 클래스 변수에 대입
        System.out.println(p); //출력 : noName.returnItSelf() 반환 값
        System.out.println(noNmae);  //출력 : 참조 변수 출력
}

마무리하며

Java를 공부하며 객체 지향 프로그래밍을 하고 있는데
필요한 용어에 대해서 조금이나마 정리해봤습니다.
많은 예제를 만들며 익숙해져야 할 것 같습니다.

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글