이번엔 클래스에 대해 작성해보려고 합니다
클래스하면 대표적으로 Main 클래스가 떠오릅니다
도대체 이 클래스는 뭐하는 녀석이고 어떻게 쓰는걸까요?
클래스(class)
객체를 정의하는 설계도라고 생각하면됩니다!
이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.
객체
- 프로그램 실행 중에 생성되는 실체
- 메모리 공간을 갖는 구체적인 실체
- 인스턴스라고도 부릅니다
자바는 객체지향언어(OOP)입니다
객체지향은 여러 특징이 있지만 한번에 작성할수 없기때문에 나눠서 작성해보도록 하겠습니다!
클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다. 즉, 필드(field)란 클래스에 포함된 변수(variable)를 의미합니다. 또한, 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다.
더 자세히 보기 위해 코드를 보겠습니다 Animal이라는 클래스를 만들고 메인 클래스 안에는 Animal cat 이라는 처음보는 녀석이 등장합니다.
class Animal {
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
}
}
Animal 클래스의 선언만 있지 내용이 없는 클래스입니다. 하지만 이 클래스는 기능을 가지고 있는데 그건 바로 객체(object)를 만드는 기능입니다.
new는 객체를 생성할 때 사용하는 키워드입니다. 이렇게 하면 Animal 클래스의 인스턴스(instance)인 cat, 즉 Animal의 객체가 만들어지게됩니다.
new 라는 키워드는 정말 많이 쓰입니다
Scanner를 호출할때도 자세히 보면
Scanner 변수명 = new Scanner(System.in); 이런식으로 적혀있습니다
그렇다면 Scanner도 클래스인가요? 맞습니다 우리가 직접 만들진않았지만 이미 만들어진 클래스입니다
우리는 그것을 호출해서 쓰는것뿐입니다. 알게 모르게 우리는 객체를 생성하고 있었고 클래스도 쓰고있었네요!
그래서 클래스와 객체는 아주 중요한 개념입니다.
그렇다면 객체에는 어떻게 접근할수 있을까요?
객체.객체변수 로 접근할수있습니다!
클래스를 알았다면 메소드를 알아야하는데
여기서는 간단하게만 살펴보겠습니다
setName이라는 메소드를 만들고 그 안에는 this.name = name; 이라는 문장이 있습니다
class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
System.out.println(cat.name);
}
}
this라는 키워드를 알아야하는데
this는 객체 자신을 가리키는 레퍼런스 변수로, 자신의 객체에 접근할 때 사용됩니다.
지금은 name에 아무런 값이 없어서 null값이 출력될겁니다
이번엔 이름을 정해주겠습니다
메소드에 접근하기 위해선 객체.메소드를 이용하면됩니다
따라서 cat.setName("maah"); maah라는 이름을 정해주면
이번엔 설정한 이름으로 출력이 될겁니다 this 는 자기 자신을 가리킨다고 했는데 지금 this는 cat을 가리킨다고 생각하면됩니다!
this.name = name;은
이렇게 해석됩니다
cat.name = "maah";
객체 변수에 값을 지정하는방법은 -> 객체.객체변수 = 값
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("maah");
System.out.println(cat.name);
}
}
한가지 더 알아보겠습니다
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("maah"); // 메서드 호출
Animal dog = new Animal();
dog.setName("happy");
System.out.println(cat.name);
System.out.println(dog.name);
}
}
이번엔 dog라는 객체(Animal의 인스턴스)를 생성했습니다
이름은 happy로 지정해줬는데요 setName이 마지막에 happy로 되었으니
출력을 시키면 happy가 두번 나오지않을까요?
하지만
maah
happy가 나옵니다
객체 변수는 공유되지 않습니다!
클래스에서 가장 중요한 부분은 객체 변수의 값이 독립적으로 유지된다는것입니다!
이 점이 바로 클래스 존재의 이유이기도 합니다
객체 = 레퍼런스 변수이고
데이터타입 변수명 = new 데이터타입();
클래스는 = 데이터타입이라고 생각하면 된다
이걸 더 자세히 살펴보면 자바의 메모리 영역을 들여다 봐야합니다
스택(Stack) 영역
지역변수, 인자값, 리턴값이 저장되는 영역이고 메소드 안에서 사용되는 기본형 변수들(int, double, boolean등)이 값과 함께 저장되고
Heap 영역에 생성된 객체들을 참조하는 주소값이 할당됩니다.
힙(Heap) 영역
자바 프로그램에서 사용되는 모든 인스턴스 변수(객체)들이 저장되는 영역이며 자바에서는 new를 사용하여 객체를 생성하면 힙 영역에 저장됩니다.
힙 영역은 메모리 공간이 동적으로 할당되고 해제되며 메모리의 낮은 주소에서부터 높은 주소로 할당이 이루어집니다. 참조형 데이터 객체의 실제 데이터가 저장되는 공간이고 Stack 영역에서 실제데이터가 존재하는 Heap 영역의 참조값을 가지고 있다.
new 키워드로 인스턴스를 생성 할 때, Heap 영역에는 생성된 객체가 저장, Stack 영역에서 생성된 객체에 대한 주소 값(Reference)이 저장됩니다.
메모리 구조로 들어가보니깐 정리하면서도 어렵긴하네요... 다음에는 메모리구조에 조금 더 살펴보고 메소드에 대해 작성해보겠습니다!
'Java > 객체지향' 카테고리의 다른 글
자바 메소드(객체지향) (1) | 2024.02.03 |
---|