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