객체를 만들기 위한 설계도
속성(필드)과 동작(메소드)을 정의
클래스에 정의된 내용을 바탕으로 만들어진 실제 인스턴스
메모리에 생성되어 동작
public class Car {
String color;
void drive() {
System.out.println("차가 달립니다");
}
}
// 객체 생성
Car myCar = new Car();
myCar.color = "빨강";
myCar.drive();
객체의 상태(필드)는 외부에서 직접 접근하지 못하도록 숨기고, 메소드를 통해 접근하게 함
정보 은닉과 유지보수성을 높임
public class BankAccount {
private int balance;
public void deposit(int amount) {
if (amount > 0) balance += amount;
}
public int getBalance() {
return balance;
}
}
기존 클래스의 속성과 기능을 확장하여 새로운 클래스를 만드는 것
코드 재사용성과 계층 구조를 용이하게 함
public class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다");
}
}
public class Dog extends Animal {
void bark() {
System.out.println("멍멍");
}
}
같은 타입의 참조 변수가 여러 형태의 객체를 가리킬 수 있음
메소드 오버라이딩과 업캐스팅을 통해 구현
public class Animal {
void sound() {
System.out.println("소리 낸다");
}
}
public class Cat extends Animal {
void sound() {
System.out.println("야옹");
}
}
Animal a = new Cat();
a.sound(); // "야옹"
필요한 정보만 공개하고, 불필요한 세부사항은 감춤
인터페이스 또는 추상 클래스를 통해 구현
abstract class Shape {
abstract void draw();
}
class Circle extends Shape {
void draw() {
System.out.println("원을 그립니다");
}
}
구성 요소 |
설명 |
---|---|
필드 (Field) |
객체의 속성 (멤버 변수) |
메소드 (Method) |
객체의 동작을 정의 |
생성자 (Constructor) |
객체가 생성될 때 초기화하는 특별한 메소드 |
접근제어자 |
public, private, protected, default |
클래스 이름과 동일
객체가 생성될 때 자동 호출
반환 타입 없음
public class Person {
String name;
// 생성자
public Person(String name) {
this.name = name;
}
}
자기 자신을 참조하는 키워드
지역변수와 필드 이름이 같을 때 주로 사용
public class Person {
String name;
public Person(String name) {
this.name = name; // this.name은 필드, name은 매개변수
}
}
집합 관계(has-a): 클래스 안에 다른 객체를 필드로 포함
상속 관계(is-a): A가 B를 상속받는 경우 A는 B의 일종
// 집합 관계
class Engine {}
class Car {
Engine engine = new Engine(); // Car has-a Engine
}
인터페이스는 메소드의 선언만 존재하고 구현은 하지 않음
interface Animal {
void sound();
}
class Cat implements Animal {
public void sound() {
System.out.println("야옹");
}
}
다형성을 활용하여 인터페이스 타입으로 다양한 구현 객체를 사용할 수 있음
Animal animal = new Cat();
animal.sound(); // 야옹
재사용성: 상속과 모듈화를 통해 코드 중복을 줄임
유지보수성: 모듈별 설계로 수정이 쉬움
확장성: 새로운 기능을 쉽게 추가 가능
현실 세계와의 유사성: 실제 객체와 유사한 구조로 설계 가능
핵심 개념 |
설명 |
---|---|
클래스 |
객체의 설계도 |
객체 |
클래스 기반 실체 |
캡슐화 |
데이터 은닉, getter/setter 사용 |
상속 |
코드 재사용, 계층적 구조 |
다형성 |
다양한 형태로 동작 가능 |
추상화 |
불필요한 정보 숨기고 필요한 기능만 노출 |