Post

[Java] 클래스 객체 생성자 은닉성

📌 들어가며

객체지향의 핵심인 클래스·객체·생성자·은닉성(캡슐화)을 체계적으로 정리하는 복습 편이다. 이름 규칙, this, getter/setter, 접근 한정자, 자바빈즈까지 한 번에 훑는다.


1. 객체와 클래스

동일한 설계로 만든 자동차라도 각 부품은 형태만 같을 뿐 독립적으로 존재한다. 마찬가지로, 여러 객체의 멤버변수는 이름은 같아도 실제 값은 서로 다르다.

Desktop View

클래스 작성과 객체 사용

1
2
3
4
class 클래스이름 {
    멤버변수;                  // 여러 개 가능
    void 메서드이름() { ... }   // 여러 개 가능
}
1
2
3
4
클래스이름 객체이름 = new 클래스이름();   // 선언 + 할당

 = 객체이름.멤버변수;              // 변수 접근
객체이름.메서드이름(값1, 값2, ...);   // 메서드 호출

💡 클래스는 객체를 위한 틀이다. 클래스 작성 시 멤버변수에 대입한 값은 “기본값”일 뿐, 객체를 통해 새 값이 들어오면 의미를 잃는다. 그래서 보통 클래스 작성 시 멤버변수에 값을 지정하지 않는다.

메서드만 있는 클래스는 재사용

데이터 없이 파라미터로 결과를 만드는 클래스는 객체를 여러 개 만들 필요 없이 하나를 재사용하는 게 바람직하다.

1
2
3
4
5
6
7
class Calc {
    int sum(int x, int y) { return x + y; }
}

Calc c1 = new Calc();
int a = c1.sum(10, 20);
int b = c1.sum(100, 200);   // 같은 객체 재사용

변수의 종류

종류유효 범위
멤버변수(전역)클래스 블록 전체
지역변수선언된 메서드/블록 안에서만

2. this

this는 “자기 자신”을 의미하는 키워드로, 지역변수와 멤버변수를 구분할 때 쓴다.

1
2
3
4
5
6
class Foo {
    String name;                 // 멤버변수
    public void setName(String name) {   // 파라미터(지역변수)
        this.name = name;        // this.name = 멤버, name = 파라미터
    }
}

💡 멤버변수와 지역변수가 같은 이름이면 유효 범위가 작은(지역) 변수가 우선된다. 그래서 파라미터로 멤버변수를 설정할 때, 이름을 다르게 하기보다 같게 두고 this로 구분하는 것이 자바의 일반적인 방식이다. 가독성을 위해 멤버변수 앞에는 this를 붙이는 게 좋다.

this는 현재 클래스의 다른 메소드를 호출할 때도 쓴다. (다만 메소드는 이름만으로도 호출 가능해 생략해도 무방)

1
String myName = this.getName();   // 현재 클래스의 getName() 호출

3. 이름 규칙

대상규칙
공통영어+숫자+_, 첫 글자 영어 
클래스첫 글자 대문자, 단어마다 대문자MyClass, Student
메서드·변수소문자 시작, 단어마다 대문자userName, memberCount
상수모두 대문자PI, COLOR

4. 생성자

생성자: new로 객체가 생성될 때 자동으로 실행되는 특수 메소드. 리턴형이 없고, 이름은 클래스와 같다. 주로 멤버변수 초기화에 사용한다.

종류설명
기본 생성자파라미터 없음. 생성자를 정의 안 하면 컴파일러가 자동 생성
파라미터 생성자파라미터로 객체를 외부에서 초기화
1
2
3
4
5
6
7
8
9
class Foo {
    String name;
    int age;
    Foo(String name, int age) {    // 파라미터 생성자
        this.name = name;
        this.age = age;
    }
}
Foo obj = new Foo("자바학생", 30);   // 생성 시 파라미터 전달

5. 은닉성 (캡슐화)

은닉성: 멤버변수나 메소드를 외부에 노출하지 않도록 숨기는 기법. 사용하는 쪽의 실수로 인한 오작동을 방지한다.

접근 한정자

한정자접근 범위관례
public모든 곳메서드에 명시
private클래스 내부만멤버변수에 명시
protected같은 패키지 + 하위 클래스잘 안 씀
default같은 패키지잘 안 씀

getter / setter

멤버변수를 private으로 숨기면 접근 방법이 사라지므로, 메소드로 간접 접근한다.

멤버변수GetterSetter
String userNameString getUserName()void setUserName(String p)
int userAgeint getUserAge()void setUserAge(int p)

💡 get/set 접두사 뒤에 변수 이름을 첫 글자 대문자로 붙인다. getter는 변수 타입을 리턴형으로, setter는 변수 타입을 파라미터형으로 명시한다.

클래스와 접근 한정자

한정자클래스에 적용 시
public다른 소스코드에서도 객체 생성 가능
default같은 소스코드끼리만 객체 생성 가능
private·protected클래스에 적용 불가

💡 유지보수를 위해 기능 단위로 소스를 분리하며, 분리된 클래스끼리는 public이어야 객체 생성이 된다. 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다.


6. 자바빈즈 (Java Beans)

자바빈즈: 재사용 가능한 표준 컴포넌트 모델. 개발 도구가 클래스를 연결·재사용·재배치할 수 있게 하는 관례를 따른다.

지켜야 할 관례:

  • 클래스는 생성자를 가져야 한다.
  • 속성은 get/set 명명법을 따르는 메소드로 접근할 수 있어야 한다.

📝 정리

1
2
3
4
5
6
클래스·객체·생성자·은닉성
├─ 클래스/객체  틀(class) → 실체(new), 멤버는 객체마다 독립
├─ this         자기 자신, 멤버-지역 변수 구분
├─ 생성자       new 시 자동 실행, 초기화 담당 (기본/파라미터)
├─ 은닉성       private + getter/setter로 간접 접근
└─ 자바빈즈     생성자 + get/set 관례를 따르는 재사용 컴포넌트
개념한 줄 정의
this자기 객체 참조, 멤버-지역 구분
생성자객체 생성 시 자동 초기화
은닉성private으로 감추고 getter/setter로 접근
자바빈즈get/set 관례를 따르는 표준 컴포넌트

클래스·객체·생성자·은닉성은 객체지향의 뼈대다. 특히 “클래스는 틀, 멤버는 객체마다 독립”, 그리고 은닉성을 위한 getter/setter 패턴은 앞으로 계속 만나게 될 핵심 원리다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.