클래스는 객체지향 프로그래밍(Object-oriented programming)에서 객체를 생성하기 위해 상태(state)와 행동(behavior)을 정의하는 일종의 설계도다.
여기서 객체란 어플리케이션의 기능을 구현하기 위해 서로 협력하는 개별적인 실체로써 물리적일 수도 있고 개념적일 수도 있다.
객체의 상태와 행동이 정의된 하나의 클래스로 비슷한 구조를 갖되 상태는 서로 다른 여러 객체를 만들 수 있다.
class Class { // 클래스
String constructor;
String instanceVar; // 인스턴스 변수
static String classVar; // 클래스 변수
static { // 클래스 초기화 블록
classVar = "Class Variable";
}
{ // 인스턴스 초기화 블록
instanceVar = "Instance Variable";
}
Class() { // 생성자
constructor = "Constructor";
}
void instanceMethod() { // 인스턴스 메서드
System.out.println(instanceVar);
}
static void classMethod() { // 클래스 메서드
System.out.println(classVar);
}
}
필드(field)
인스턴스 변수
클래스 변수
메서드(method)
인스턴스 메서드
클래스 메서드
생성자(constructor)
초기화 블록(initializer)
public class ListNodeStack { // 일반적인 클래스, 외부 클래스
Node topNode; // 내부클래스 Node 객체를 생성
@Getter
class Node{ // 내부 클래스
int data;
Node next;
public Node (int data){
this.data = data;
}
}
}
익명 클래스는 이름이 지정되어 있지 않은 클래스를 의미한다.
public interface Monster{
String getName();
}
public static void main(String args[]){
Monster monster = new Monster(){
String name;
public String getName(){
return name;
}
};
System.out.println(monster.getName());
}
public class Pet{
String name = "돼지";
public String getName(){
return name;
}
}
public static void main(String[] args){
Pet pet = new Pet(){
String name = "익명 돼지";
@Override
public String getName(){
return name;
}
};
System.out.println(pet.getName()); // 결과 : 익명 돼지
}
Pocketmon이라는 클래스의 인스턴스를 생성하는 간단한 코드를 작성해본다.
/*
class Pocketmon {
String name;
int hp;
Pocketmon(String name, int hp) {
this.name = name;
this.hp = hp;
}
*/
public static void main(String[] args) {
Pocketmon pikachu = new Pocketmon("pikachu",10);
}
바이트 코드
Compiled from "Test.java"
public static void main(java.lang.String[]);
Code:
0: new #7 // class javabasic/week5/Pocketmon
3: dup
4: ldc #9 (상수 풀의 인덱스) // String Pikachu
6: bipush 10
8: invokespecial #11 // Method javabasic/week5/Pocketmon."<init>":(Ljava/lang/String;I)V
11: astore_1
12: return
메서드는 객체의 행동을 정의한다.
메서드도 변수처럼 클래스 메서드와 인스턴스 메서드를 사용할 수 있다.
메서드명은 변수명과 마찬가지로 Lower Camel case를 사용하며, 기본적인 메서드의 형식은 다음과 같습니다.
<접근제어자> <반환 타입> 메서드명(파라미터) {
내용
return 반환값 //없을 시 생략 가능
}
인스턴스 메서드는 인스턴스가 생성된 후 사용할 수 있는 메서드다.
메서드 내부에서 인스턴스 변수와 클래스 변수 모두 사용이 가능하다.
class Person {
public String name;
public static int age;
public Person(String name) {
this.name = name;
age++;
}
public void sayHello() {
System.out.println(this.name + "님 현재 인원은" + age + "명 입니다.");
}
}
public static void main(String[] args) {
Person person = new Person("sam");
person.sayHello(); //sam님 현재 인원은 1명입니다.
}
클래스 메서드는 인스턴스가 아닌 클래스에 종속되는 메서드다.
클래스 변수와 마찬가지로 인스턴스 메서드 처럼 선언한 후 static 키워드를 붙여 사용하며 클래스 메서드 내부에서는 클래스 변수만 사용 가능하다.
class Person {
//..
public static void printTotalCount() {
System.out.println(count);
// System.out.println(this.name); //error
}
}
public static void main(String[] args) {
Person.printTotalCount(); //1
Person person = new Person("sam");
person.printTotalCount(); //1
}
참조