자바

객체 지향 프로그래밍

클래스와 객체

클래스는 객체 지향 프로그래밍의 기본 단위로, 객체를 생성하기 위한 설계도 역할을 합니다. 클래스는 속성(필드)과 행동(메서드)을 정의합니다. 객체는 클래스의 인스턴스로, 클래스에서 정의한 속성과 메서드를 실제로 사용할 수 있는 구체적인 실체입니다. 예를 들어, class Dog { String name; void bark() { System.out.println("Woof!"); } }라는 클래스가 있을 때, Dog myDog = new Dog();를 통해 myDog라는 객체를 생성할 수 있습니다. 객체는 클래스의 속성을 통해 상태를 유지하고, 메서드를 통해 행동을 수행합니다.

캡슐화

캡슐화는 객체의 속성과 메서드를 하나의 단위로 묶고, 외부에서 직접 접근하지 못하도록 보호하는 개념입니다. 이를 통해 데이터의 무결성을 유지하고, 객체의 내부 구현을 숨길 수 있습니다. 자바에서는 접근 제어자(예: private, public, protected)를 사용하여 캡슐화를 구현합니다. 예를 들어, 클래스의 필드를 private으로 선언하고, 이를 조작하기 위한 getter와 setter 메서드를 제공함으로써 외부에서 직접 접근하지 못하도록 할 수 있습니다. 이렇게 하면 객체의 상태를 안전하게 관리할 수 있습니다.

상속

상속은 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높이고, 계층 구조를 형성할 수 있습니다. 자바에서는 extends 키워드를 사용하여 상속을 구현합니다. 예를 들어, class Animal { void eat() { System.out.println("Eating..."); } }라는 부모 클래스가 있을 때, class Dog extends Animal { void bark() { System.out.println("Woof!"); } }와 같이 자식 클래스를 정의할 수 있습니다. 자식 클래스는 부모 클래스의 메서드를 사용할 수 있으며, 필요에 따라 메서드를 오버라이드(재정의)하여 자신만의 기능을 추가할 수 있습니다.

다형성

다형성은 동일한 메서드가 다양한 형태로 동작할 수 있는 능력을 의미합니다. 자바에서는 메서드 오버로딩과 메서드 오버라이딩을 통해 다형성을 구현합니다. 메서드 오버로딩은 같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 여러 개 정의하는 것이고, 메서드 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다. 예를 들어, class Animal { void sound() { System.out.println("Animal sound"); } }와 같은 부모 클래스가 있을 때, class Dog extends Animal { void sound() { System.out.println("Woof!"); } }와 같이 자식 클래스에서 메서드를 오버라이드할 수 있습니다. 이를 통해 객체의 실제 타입에 따라 적절한 메서드가 호출되므로, 유연하고 확장 가능한 코드를 작성할 수 있습니다.

추상화

추상화는 복잡한 시스템에서 불필요한 세부사항을 숨기고, 중요한 개념만을 표현하는 과정입니다. 자바에서는 추상 클래스와 인터페이스를 통해 추상화를 구현합니다. 추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있으며, 이를 상속받는 자식 클래스에서 구체적인 구현을 제공해야 합니다. 인터페이스는 메서드의 시그니처만 정의하고, 이를 구현하는 클래스에서 메서드를 구현합니다. 예를 들어, interface Animal { void sound(); }와 같은 인터페이스가 있을 때, class Dog implements Animal { public void sound() { System.out.println("Woof!"); } }와 같이 구현할 수 있습니다. 추상화를 통해 개발자는 시스템의 복잡성을 줄이고, 코드의 가독성과 유지보수성을 높일 수 있습니다.