클래스란 객체를 정의하는 설계도라고 볼 수 있다. 많이 사용하는 예시로 설명하자면 붕어빵 틀은 클래스, 붕어빵은 객체이다.
붕어빵 틀 하나로 붕어빵을 여러개 찍어낼 수 있듯이 클래스로 같은 모양의 객체를 여러개 만들어 낼 수 있다.
내가 지금까지 코드를 작성해왔던 공간도 Main 클래스 내부였다.
public class Main { // 여기부터
public static void main(String[] args) {
}
// 여기까지!!
}
글자로만 끄적이면 이해가 잘 안되니 코드와 함께 직접 회원 정보를 저장하는 객체와 그 객체를 만들기 위한 설계도인 Member 클래스를 만들고,
클래스의 구성요소와 사용법을 알아보자.
일단 같은 모양의 객체를 만들어 낼 클래스를 먼저 생성한다.
class Member {
// 필드
// 메서드
}
속성과 기능을 합쳐 멤버라고도 표현한다.
Member 클래스는 회원의 이름, 나이 정보를 포함한다.class Member {
// 필드
String name;
int age;
// 메서드
}
Member 클래스는 레벨업의 기능을 수행할 수 있다.class Member {
// 필드
String name;
int age;
// 메서드
void LevelUp(){
System.out.println("레벨업");
}
}
필드와 메서드는 인스턴스를 생성하여 접근할 수 있다. 하지만 static 키워드가 붙은 멤버는 객체 생성과 무관하다. 외부에서 바로 접근할 수 있고, 인스턴스에 존재하지 않고 클래스에 존재하여 값을 공유한다.
static 변수를 클래스 변수라고도 한다.
class a {
int a; // 인스턴스 변수
static int b; // 클래스 변수
}
new 클래스명()을 사용하여 객체를 생성한다. 만든 객체는 변수에 연결하여 제어할 수 있다.
클래스이름 변수명 = new 클래스이름();
new 클래스이름()으로 객체를 생성한다.클래스이름타입의 변수명에 만든 객체를 연결한다.클래스이름 타입이 뭔가 싶겠지만 int 같은 자료형이라고 생각하면 된다.int a;에는 int 타입만 저장할 수 있듯이 객체의 리모컨(주소) 타입만 담을 수 있는 변수를 만든 것이다.변수명에는 생성한 객체의 리모컨(주소)이 저장된다.변수명.필드 또는 변수명.메서드 형식으로 접근할 수도 있다.class Main {
public static void main(String[] args) {
Member aMem = new Member();
aMem.name = "강낭콩"; // 인스턴스 변수
aMem.age = 22;
}
}
class Member {
// 필드
String name;
int age;
// 메서드
void LevelUp(){
System.out.println("레벨업");
}
}
aMem에 연결된 객체는 Member의 인스턴스이다.Member의 인스턴스는 aMem에 연결된 객체 한 개다.New라는 새로운 클래스가 있다고 가정할 때, aMem은 객체이지만 New의 인스턴스는 아니다.현재 인스턴스를 가리키는 참조 변수. 인스턴스 변수에 저장된 값을 가르킨다.
사용 예시
class Main {
public static void main(String[] args) {
Member aMem = new Member();
aMem.name = "강낭콩"; // 인스턴스 변수
aMem.age = 22;
aMem.LevelUp(); // 1
}
}
class Member {
// 필드
String name;
int age;
// 메서드
void LevelUp(){ // 2
System.out.println("%s 레벨업", this.name);
}
}
출력
강낭콩 레벨업
aMem이 가르키는 객체의 LevelUp함수를 실행한다.LevelUp함수는 인스턴스 변수aMem.name에 저장된 강낭콩을 사용하여 강낭콩 레벨업을 출력한다.일회용객체
지금까지는 생성한 객체를 재사용하기 위해 변수에 연결해두었지만, 변수에 연결해두지 않고 객체 생성만 할 수도 있다. 이 때 이 객체는 1회용 객체다. 즉, 다시 접근하지 못한다.
class Main {
public static void main(String[] args) {
new Myclass.hi() // 변수에 연결하지 않는 객체 생성
new Myclass.hi() // 일회용 객체 생성
}
}
class MyClass {
static void hi(){
System.out.println("hi 실행");
}
}
변수에 연결하지 않은 객체를 만들어 hi()함수를 실행한다. 이 때 만들어진 객체는 함수 실행이 끝날 때 함께 사라진다.
new 키워드로 객체를 2개 만들었는데 이 둘은 서로 전혀 관련이 없는 객체이다.
각각의 명칭이 너무 다양해서 헷갈린다. -> 자주 보면서 익숙해지거나 외워야 할 필요가 있다.
또 클래스를 배우면서 객체지향(OOP)에 대해 조금 알게된 거 같다. 이전에 자격증 공부를 하면서 무작정 외웠던 것들 퍼즐조각들이 하나씩 맞춰지는 느낌이다.
그렇지만 객체지향이 뭔지 물어본다면 멋지게 답변할 수 있도록 개념을 더 확실히 해야할 것 같다.