캡슐화(Encapsulation)
데이터를 숨기고 메서드를 통해 접근(private, getter/setter)
데이터와 메서드를 하나로 묶어 외부에서 접근하지 못하게 보호하는 개념
사용하는 목적
- 외부로부터 클래스에 정의된 속성과 기능을 보호하기 위해
- 내부의 동작을 감추고, 외부에는 필요한 부분만 노출하기 위해
상속(Inheritance)
부모클래스의 기능을 물려 받는 것 (extends 사용)
상속을 통해 자식클래스는 부모클래스의 변수와 기능을 물려받아
재사용이 가능해짐.
이를 통해서 코드의 중복을 제거 가능
다형성(Polymorphism)
같은 이름의 메서드가 다양한 방식으로 동작 (오버로딩, 오버라이딩)
- 메서드 오버라이딩(재정의)
부모클래스의 메서드를 자식클래스에서 재정의해서 사용
독자적인 기능 추가 가능해짐
- 메서드 오버로딩
같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용
메서드 이름을 동일하게 유지하면서 다양한 상황에 유연하게 대처 가능
적절하게 사용 시 코드의 유연성을 높이고, 불필요한 코드 중복을 방지해
유지보수성을 높이지만, 과도한 사용은 코드의 동작을 이해하는데 어려울 수
있으므로 적절한 사용을 권장
추상화(Abstraction)
핵심 틀만 잡아주고 복잡한 내부는 숨김 (인터페이스, 추상클래스 사용)
추상화로 구현해두면 새로운 객체를 생성할 때 클래스 고유의 기능만
새로 만들어주고, 공통된 기능은 상속을 통해 넘겨줄 수 있음
공통된 기능을 다시 정의할 필요가 없어 코드의 중복이 줄어들고
코드의 재사용이 용이해져 가독성이 높아짐
객체는 데이터와 동작들을 묶어 하나로 관리하고,
객체를 조립해 프로그래밍하는 것이 객체지향프로그래밍
객체지향프로그래밍은 코드의 재사용을 줄여 가독성을 높이며,
유지보수를 쉽게 만들고 유연성을 높여 편리한 사용이 가능
클래스 : 제품을 만들 설계도 (객체를 만들기 위한 기본적인 틀)
객체(인스턴스) : 설계도로 만든 제품 (메모리에 저장된 실체)
속성(필드) : 클래스 안의 변수 (객체가 가지는 데이터 / 이름 나이...)
메서드 : 클래스 안의 함수 (객체가 수행할 수 있는 동작 / 인사, 달리기..)
생성자 : 객체를 만들 때 자동으로 호출되는 특수한 메서드
class Main {
public static void main(String[] args) {
Person p = new Person("철수", 20); // 객체 p 생성
p.hello(); // 메서드 호출
}
}
class Person { // 클래스 생성
String name; // 속성(필드)
int age;
Person(String name, int age) { // 생성자
this.name = name;
this.age = age;
}
void hello() { // 메서드
System.out.println("안녕하세요 저는 " + name + "입니다.");
}
}
클래스의 속성, 메서드에 접근할 수 있는 범위를 제한하는 키워드
public : 어디서 접근 가능
private : 클래스 내부에서만 접근 가능
protected : 같은 패키지, 자식클래스에서 접근 가능
(default) : 같은 패키지에서만 접근 가능 (아무 키워드 안 쓴 경우)
static이 붙은 속성, 메서드는 클래스 자체에 속함 (객체 생성없이 사용 가능)
class Math{
static int square(int x) {
return x* x;
}
}
int result = Math.square(5); // 객체없이 사용
static 변수
모든 객체가 공유하는 변수
class Student {
static int count = 0; // 모든 학생이 공유
String name;
Student(String name) {
this.name = name;
count++; // 학생이 만들어질 때마다 증가
}
}
class Main {
public static void main(String[] args) {
Student s1 = new Student("철수");
Student s2 = new Student("영희");
System.out.println(Student.count); // 출력: 2
}
}
객체 자신을 가리키는 키워드
생성자나 메서드 내에서 속성과 매개변수 구분 시 사용
매개변수가 다른 경우 생성자를 여러개 만들 수 있음
class Dog{
String name;
int age;
Dog() {
name = "이름 없음";
age = 0;
Dog(String name, int age) {
name = n;
age = a;
}
}
상속(is_ a) 관계
책상은 사람이다 -> Students extends Person
포함(has_ a) 관계
자동차는 엔진을 가짐 -> Car has Engine
클래스 안에 정의된 클래스로
특정 클래스에만 관련된 클래스 정의 시 사용
class Outer {
class Inner {
void print() {
System.out.println("내부클래스");
}
}
}
abstract class Animal {
String name;
void sleep() {
System.out.println(name + "이 잔다.");
abstract void sount(); // 추상메서드(내용 없음)
공통적인 틀을 제공하되, 구체적인 동작은 자식클래스에서 정리
1. 다중 상속이 불가능한 자바에서 여러 역할을 동시에 부여 가능
2. 협업, 표준화에 적합 (모두 같은 메서드 명을 구현)
interface flyable(인터페이스명) {
void fly(); // 자동으로 public abstract