1. 클래스(class)
객체를 생성하기 위한 청사진 역할을 한다. 여러 가지 인스턴스 변수와 인스턴스 메서드로 구성된다.
2. 변수(instance variable)
클래스 내에서 사용되는 변수. 클래스의 속성을 나타낸다
3. 메서드(instance method)
클래스 내부에서 정의된 함수. 객체의 동작을 정의한다.
4. 객체(object)
클래스를 기반으로 생성된 클래스의 인스턴스. 실제 데이터를 담고 있다. 클래스를 사용해 만들 수 있는 실체.
클래스를 정의하면 그 클래스에는 속성(변수)와 행동(메서드)를 정의한 청사진만 담겨있다.
이 클래스를 바탕으로 new 키워드를 사용해 객체를 생성하게 되면, 메모리 공간에 실제 데이터가 자동으로 할당되고, 클래스가 정의한 속성과 행동을 가지는 구체적인 실체가 된다.
그래서 객체는 클래스의 '실체화된 형태'(인스턴스)다.
5. 인터페이스(interface)
클래스가 구현해야 하는 메서드의 집합을 정의하는 일종의 청사진이다. 인터페이스는 메서드의 이름과 매개변수(시그니처)를 선언하고, 구현은 해당 인터페이스를 구현하는 클래스가 담당하게 한다.
인터페이스 선언: 인터페이스는 interface 키워드를 사용하여 선언한다. 메서드는 구현되지 않고, 시그니처만 선언된다.
시그니처: 메서드를 식별하는 데 사용하는 요소.
public interface Animal {
void sound(); // 소리 내는 메서드
void eat(); // 먹는 메서드
}
이제 Animal이 implements된 클래스들은 sound와 eat를 구현해야한다.
void: 메서드의 변환 타입이 없음을 의미한다. void를 사용하면 메서드가 값을 반환하지 않고, 단순히 작업을 수행하기만 한다는 뜻이다. 작업을 수행한 후 값을 return하지 않고 메서드가 종료된다. 출력, 상태 변경, 메세지 전송 등에서 유용하다.
인터페이스 구현: 인터페이스를 구현하려면 implements 키워드를 사용하여 클래스를 정의하고, 인터페이스의 모든 메서드를 구현해야 한다.
public class Dog implements Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
@Override
public void eat() {
System.out.println("강아지가 먹습니다.");
}
}
public class Cat implements Animal {
@Override
public void sound() {
System.out.println("야옹!");
}
@Override
public void eat() {
System.out.println("고양이가 먹습니다.");
}
}
Dog와 Cat 클래스는 Animal 인터페이스를 구현하기 때문에 모두 sound와 eat 메서드를 가지고 있어야 하며, 각 클래스마다 다른 방식으로 구현할 수 있다.
동일한 기능을 제공하지만 다양한 방식으로 구현이 필요한 경우 유용하다. 여러 종류의 동물을 Animal 인터페이스로 묶어두면 다형성을 활용할 수 있다.
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 멍멍!
myCat.sound(); // 야옹!
}
}
Animal 타입의 변수를 통해 Dog와 Cat 객체를 다룰 수 있으며, 코드를 변경하지 않고도 다양한 동물을 추가할 수 있는 확장성을 얻을 수 있다.
6. 다형성(Polymorphism)
객체가 여러 가지 형태를 가질 수 있는 성질이다. 주로 상속과 인터페이스를 통해 구현된다. 객체의 타입이 바뀌어도 같은 메서드를 호출할 수 있어서 코드의 재사용성이 높아진다. 새로운 클래스가 추가되어도 기존 코드의 수정 없이 기능을 확장할 수 있다.
메서드 오버로딩을 통해 구현된 다형성: 같은 클래스 내에서 같은 이름의 메서드를 매개변수의 유형이나 개수(시그니처)를 다르게 해서 여러 번 정의하는 것이다. 자바 컴파일러가 컴파일할 때 어떤 메서드를 호출할지 결정하게 된다.
public class Math {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
add라는 이름의 메서드가 매개변수 타입에 따라 두 가지로 정의되어 있다.add(int,int)와 add(double,double)은 시그니처가 다르기 때문에 오버로딩이 가능한 것이다. add(3,5) 호출 시 위의 정수형 메서드가, add(3.0, 5.0) 호출 시 실수형 메서드가 실행된다.
메서드 오버라이딩을 통해 구현된 다형성: 상위 클래스에 정의된 메서드를 하위 클래스에서 재정의 하는 것이다. 부모 클래스 타입의 참조 변수가 하위 클래스의 인스턴스를 참조할 때, 실제 객체 타입에 따라 해당 메서드가 실행된다.
class Animal {
public void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹!");
}
}
이제 Animal 타입의 변수에 Dog 또는 Cat 객체를 할당하면, sound 메서드를 호출할 때 참조된 실제 객체에 따라 다른 메서드가 실행된다.
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 멍멍!
myCat.sound(); // 야옹!
}
}
여기서 myDog.sound()와 myCat.sound()는 Animal 클래스의 sound 메서드를 호출하지만, 실제로는 각각 Dog와 Cat 클래스에서 재정의된 메서드가 실행된다.
'Coding > JAVA + game' 카테고리의 다른 글
JAVA - 용어 정리<2> (1) | 2024.11.11 |
---|---|
객체 지향 실습 - 게임에 적용 (5) | 2024.11.09 |
JAVA 공부 시작! (3) | 2024.11.07 |