Dev.Std
클래스 (Class) 본문
클래스와 객체
객체(object)는 현실 세계의 개념이나 사물을 소프트웨어적으로 나타낸 것을 말한다. 그리고 클래스(Class)는 객체를 만드는 도구(틀)이다.
예를 들어서 동물이라는 개념을 프로그래밍 상에서 나타내면 다음과 같다.
class Animal {
}
여기서 Animal 클래스는 클래스의 선언만 있고 내용이 없는 가장 간단한 형태의 클래스이다. 앞에서 클래스가 객체를 만드는 도구라고 했는데, 실제로 객체를 만들어 보면 다음과 같다.
public class Main {
public static void main(String[] args) {
Animal cat = new Animal();
}
}
여기서 new는 객체를 생성할 때 사용하는 키워드이다. 이렇게 클래스에 의해서 생성된 객체를 인스턴스(instance)라고 한다. 즉, 클래스가 new키워드로 인해 메모리를 할당받아 실제 데이터를 담게 되면 인스턴스가 된다.
객체 변수
Animal 클래스에 동물 이름을 알 수 있는 String 자료형 변수를 추가해보았다.
public class Animal {
String name;
}
이렇게 클래스 내에 선언된 변수를 객체 변수(instance variable)라고 한다. 객체 변수는 인스턴스 변수, 멤버 변수, 속성 등 여러가지로 불린다.
Animal 클래스 내에 선언된 객체 변수 name에 다음과 같이 접근 가능하다.
public class Main {
public static void main(String[] args) {
Animal cat = new Animal();
cat.name = "고양이";
System.out.println(cat.name);
}
}
고양이
4번째 줄을 보면 cat.name으로 객체 변수에 접근하고 있는 걸 볼 수 있다. 따라서 클래스 내에 선언된 객체 변수에는 객체.객체변수로 접근할 수 있음을 알 수 있다.
메서드
객체 변수는 객체의 상태를 결정했다면, 메서드(method)는 객체가 수행하는 동작이나 기능을 나타낸다.
public class Animal {
String name;
public void work(String name) {
this.name = name;
System.out.println(this.name + "이(가) 걷습니다.");
}
}
public class Main {
public static void main(String[] args) {
Animal cat = new Animal();
cat.name = "고양이";
cat.work(cat.name);
}
}
고양이이(가) 걷습니다.
객체 변수에 접근한 것과 동일하게 메서드에 접근하는 경우에도 객체.메서드()와 같은 형태로 접근한다. work() 메서드는 매개변수로 String형 변수 name을 받아서 출력값에 포함시키고 있다.
이때 매개변수로 선언된 name과 메서드 내에서 접근하고 있는 name은 다르다. 따라서 메서드 내에서 그냥 name이라고 접근하게 되면 매개변수로 넘어온 값을 사용하는 것인지 객체 변수에 접근하는 것인지 알기 힘들다. 그래서 this로 Animal 클래스의 객체 자신을 가르키는 방법을 사용한다.
객체는 독립적
public class Main {
public static void main(String[] args) {
Animal cat = new Animal();
cat.name = "고양이";
Animal dog = new Animal();
dog.name = "강아지";
System.out.println(cat.name);
System.out.println(dog.name);
}
}
고양이
강아지
Animal 객체인 dog를 하나 더 만들고, dog의 name에 "강아지"라는 값을 넣었다. 이 때 같은 name 변수에 "고양이"를 넣고 그 다음에 "강아지"를 넣었으니까 결과는 둘 다 "강아지"가 될 것이라고 생각할 수 있는데, 각각의 객체 변수는 독립적이다.
객체는 객체 변수가 독립적으로 존재하고 서로 영향을 주지 않는다. 즉, 클래스가 생성한 각각의 인스턴스는 모두 다 독립적인 개체이다.
사실 cat.name이나 dog.name처럼 다른 클래스에서 직접적으로 객체의 변수에 접근하게 하는 것은 올바른 설계 방법은 아니다. 이는 객체 지향 프로그래밍 특징 중 하나인 캡슐화와 관련이 있다.
캡슐화는 객체의 내부 상태를 외부로부터 은닉하고, 외부에서 직접적인 접근을 제어함으로써 객체의 독립성을 보장한다.
따라서 객체의 직접 접근이 아닌 해당 객체의 메서드를 이용해서만 해당 변수에 접근하도록 하는게 바람직한 설계일 것이다.
'📂Language > Java' 카테고리의 다른 글
상속 (Inheritance) (0) | 2024.04.10 |
---|---|
접근 제어자 (Access Modifier) (0) | 2024.04.07 |
값에 의한 호출 & 객체(참조)에 의한 호출 (Call by value & Call by object(reference)) (0) | 2024.04.07 |
생성자 (Constructor) (0) | 2024.04.05 |