클래스 (Class): 객체를 만들어내기 위한 설계도 또는 템플릿입니다. 객체가 가질 속성(상태)과 행위(동작)를 정의합니다.
객체 (Object): 클래스라는 설계도를 바탕으로, 메모리에 실제로 구현된 실체입니다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(Instance)라고 합니다.
// 클래스 (설계도)
class Car {
// 속성 (멤버 변수, 필드)
String color;
int speed;
// 행위 (메서드)
void drive() {
System.out.println("차가 달립니다.");
}
}
// 객체 생성 (인스턴스화)
Car myCar = new Car(); // Car 클래스의 인스턴스(객체)를 생성하여 myCar 변수에 할당
myCar.color = "Red"; // 객체의 속성에 접근
myCar.drive(); // 객체의 행위를 호출
개념: 관련된 데이터(속성)와 기능(메서드)을 하나의 클래스로 묶고, 외부에서 데이터에 직접 접근하는 것을 막아 정보를 은닉(Information Hiding)하는 것입니다.
구현:
private 접근 제어자로 선언하여 외부 접근을 차단합니다.public으로 공개된 메서드(Getter/Setter)를 통해서만 데이터에 접근하고 수정할 수 있도록 허용합니다.장점:
setSpeed 메서드에서 음수 값이 들어오지 못하게 막을 수 있음)public class Person {
private int age; // private으로 정보 은닉
// public 메서드를 통해 데이터에 접근
public int getAge() {
return this.age;
}
public void setAge(int age) {
if (age > 0) { // 데이터 보호
this.age = age;
}
}
}
개념: 기존의 클래스(부모/슈퍼 클래스)를 재사용하여, 그 속성과 메서드를 물려받는 새로운 클래스(자식/서브 클래스)를 만드는 것입니다. (extends 키워드 사용)
장점:
super 키워드: 자식 클래스에서 부모 클래스의 멤버(생성자, 메서드)에 접근할 때 사용합니다.
class Animal { // 부모 클래스
void eat() { System.out.println("먹는다"); }
}
class Dog extends Animal { // 자식 클래스
void bark() { System.out.println("짖는다"); }
}
Dog myDog = new Dog();
myDog.eat(); // 부모의 메서드를 물려받아 사용 가능
myDog.bark();
개념: "여러 가지 형태를 가질 수 있는 능력". 하나의 타입(부모 클래스 타입)으로 여러 다른 형태의 객체(자식 클래스 객체)를 참조할 수 있는 성질입니다.
구현:
장점: 코드를 더 유연하고 확장성 있게 만듭니다. 객체를 부품처럼 쉽게 교체할 수 있습니다.
Animal animal1 = new Dog(); // 업캐스팅
Animal animal2 = new Cat(); // 업캐스팅
animal1.makeSound(); // Dog의 makeSound() 호출: "멍멍"
animal2.makeSound(); // Cat의 makeSound() 호출: "야옹"
// 동일한 animal.makeSound() 코드가, 실제 객체가 무엇이냐에 따라 다르게 동작함
abstract 키워드 사용.interface 키워드 사용.