지금부터 클래스에 대해 알아보도록 하자. 클래스에 대해 개념적 설명보단 간단한 클래스부터 규모를 키워가는 방식으로 진행하도록 한다.
먼저 Animal 클래스를 Test.java 파일에 작성해보도록 한다.
class Animal{
}
public class Test{
public static void main(String[] args){
}
}
보통 클래스는 특별한 경우가 아니라면 파일 단위로 작성해야 한다.
위 클래스는 가장 간단한 형태의 클래스로
다음과 같은 특징을 가지고 있다. 하지만 껍데기뿐인 클래스도 중요한 기능을 가지고 있는데, 그 기능은 객체(object)를 만드는 기능이다.
객체는 다음과 같이 만들 수 있다.
class Animal{
}
public class Test{
public static void main(String[] args){
Animal cat = new Animal();
}
}
new
는 객체를 생성할 때 사용하는 키워드이다.
위 과정을 통해 Animal의 객체가 만들어진 것이다.(cat은 Animal의 인스턴스이다.)
클래스를 가장 잘 설명한다는
붕어빵 틀(Class)
과붕어빵(object)
을 예로 들 수 있는데 필자는 이 예제가 추상적이라 더 헷갈리는 것 같다.
대신 아래와 같은 예제로 이해해보자.
class Animal{
}
public class Test{
public static void main(String[] args){
Animal cat = new Animal();
Animal dog = new Animal();
Animal bird = new Animal();
Animal lion = new Animal();
}
}
Animal 클래스를 만듦으로써 cat, dog, bird, lion 객체를 생성했다.(찍어냈다.)
위에 생성한 Animal 클래스에 변수(name)를 추가해보자.
class Animal{
String name; // 객체 변수
}
public class Test{
public static void main(String[] args){
Animal cat = new Animal();
System.out.println(cat.name); // null 출력
}
}
이렇게 Animal에 클래스에 선언된 name은 객체 변수라고 하며, 객체 변수는 인스턴스 변수, 멤버 변수, 속성이라고 한다.
클래스 > 객체 > 객체 변수
클래스를 통해 생성된 객체를 인스턴스라 하며 클래스로부터 객체를 만드는 과정을 인스턴스화라 한다.
그렇다면 객체와 인스턴스의 차이는 무엇일까?
두 용어는 크게 차이가 없으며 때에따라 혼용할 수 있지만 엄밀히 구분하자면 아래와 같은 차이가 있다.
메소드는 클래스 내에 구현된 함수를 의미하는데 보통 함수라 하지않고 메소드라 한다.
메소드를 이용해 Animal 클래스의 객체 변수인 name에 값을 대입해보자.
* setName 메소드를 추가해보자.
class Animal{
String name;
public void setName{
this.name = name;
}
}
public class Test{
public static void main(String[] args){
Animal cat = new Animal();
System.out.println(cat.name);
}
}
Animal 클래스에 추가된 setName 메소드는 다음과 같은 형태이다.
setName 메소드를 호출할 수 있도록 main 메소드를 수정해보자.
class Animal{
String name; //1) 필드
public static setName{ // 2) 메서드
this.name = name;
}
Animal{...} //3) 생성자
class AnimalSubClass{}// 4) 이너클래스
}
public class Test{
public static void main(String[] args){
Animal cat = new Animal();
cat.setName("Tom"); //메소드 호출
System.out.println(cat.name);
}
}
이 과정에서 this.name = "Tom"; 은
cat.name = "Tom"와 같이 해석된다.
위 1) ~ 4) 요소는 다음과 같다
1) 필드 - 클래스의 속성 표시.(ex-컴퓨터의 색상, 사양, 용량 등)
2) 메서드 - 클래스의 기능 표시(ex - 컴퓨터에서 게임하기, 블로그작성, 연산하기등)
3) 생성자 - 클래스의 객체 생성 역할
4) 이너 클래스 - 클래스 내부의 클래스
객체 변수는 공유되지 않는다. 예제 코드를 통해 공유되지 않는다는 말이 무엇인지 알아보자.
class Animal{
String name;
public void setName(String name){
this.name = name;
}
}
public class Test{
public static void main(String[] args){
Animal cat = new Animal();
cat.setName("Tom"); // 메소드 호출
Animal bird = new Animal();
bird.setName("hardy"); // 메소드 호출
System.out.println(cat.name);
System.out.println(bird.name);
}
}
위 cat과 bird의 name은 각각 Tom
과 hardy
가 나오게 된다. 만약 name 객체 변수가 공유되었다면 마지막에 입력된 hardy
만 나왔을 것이다. 이를 통해 클래스의 객체 변수 값은 독립적으로 유지된다는 점을 유념하자.
객체 변수 값은 공유되지 않으나 static을 이용하면 객체 변수를 공유하도록 만들 수도 있다.