본문 바로가기

자바(java)

7강: 객체 지향 프로그래밍

반응형

1. 클래스와 객체의 정의
클래스(Class) 는 객체를 생성하기 위한 템플릿입니다. 클래스는 객체의 구조와 행동을 정의하며, 멤버 변수(속성)와 메서드(행동)를 포함합니다.

객체(Object) 는 클래스의 인스턴스입니다. 클래스에 정의된 속성과 행동을 실제로 가지고 있는 실체입니다.
예를 들어, 'Dog'라는 클래스가 있을 때, 각각의 개(Dog 객체)는 'Dog' 클래스의 인스턴스입니다.


public class Dog {
    String breed;
    int age;

    void bark() {
        System.out.println("Woof!");
    }
}

Dog myDog = new Dog(); // 객체 생성
myDog.breed = "Beagle";
myDog.bark(); // 메서드 호출

 


2. 생성자, 멤버 변수, 메서드
생성자(Constructor) 는 객체가 생성될 때 호출되는 특별한 메서드입니다. 객체의 초기화를 담당하며, 클래스 이름과 같습니다.
멤버 변수(Member Variables) 는 객체의 속성을 나타내는 변수들입니다. 객체의 상태를 저장합니다.
메서드(Methods) 는 객체의 행동을 나타내며, 클래스 내에서 함수처럼 정의됩니다.

public class Car {
    String model; // 멤버 변수

    Car(String model) { // 생성자
        this.model = model;
    }

    void display() { // 메서드
        System.out.println("Car model: " + model);
    }
}

 

3. 상속과 다형성 개념
상속 (Inheritance)
상속은 객체 지향 프로그래밍에서 중요한 개념으로, 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 것을 의미합니다. 상속을 통해 코드의 재사용성을 높이고, 유지 보수를 용이하게 하며, 계층적인 클래스 구조를 만들 수 있습니다.

특징
기본 클래스(Base Class) 또는 슈퍼 클래스(Super Class): 속성과 메서드를 제공하는 클래스입니다.
파생 클래스(Derived Class) 또는 서브 클래스(Sub Class): 상속을 통해 속성과 메서드를 물려받는 클래스입니다.
서브 클래스는 슈퍼 클래스의 모든 공개(public) 및 보호된(protected) 멤버를 상속받습니다.
extends 키워드를 사용하여 상속을 구현합니다.


class Animal {
    void eat() {
        System.out.println("Eating...");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Barking...");
    }
}

Dog d = new Dog();
d.eat(); // Animal 클래스의 메서드
d.bark(); // Dog 클래스의 메서드


다형성 (Polymorphism)
다형성은 '많은 형태'를 의미하며, 같은 메서드 호출이 다른 실행 결과를 낼 수 있게 합니다. 다형성을 통해 프로그램은 다양한 타입의 객체에 대해 동일한 인터페이스를 제공할 수 있습니다.

특징
다형성은 주로 메서드 오버라이딩(Overriding)과 메서드 오버로딩(Overloading)을 통해 구현됩니다.
메서드 오버라이딩: 서브 클래스가 슈퍼 클래스의 메서드를 재정의하는 것입니다.
메서드 오버로딩: 같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 하여 여러 개 정의하는 것입니다.
다형성은 프로그램의 유연성과 확장성을 향상시킵니다.

class Animal {
    void sound() {
        System.out.println("Some sound");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Meow");
    }
}

Animal myAnimal = new Cat(); // 다형성을 사용하여 Cat 객체를 Animal 타입으로 참조
myAnimal.sound(); // "Meow" 출력


상속과 다형성의 관계
상속은 다형성을 구현하는 기반이 됩니다. 상속을 통해 메서드를 재정의(오버라이딩)하거나 확장할 수 있으며, 이는 다형성의 주요 구현 방법 중 하나입니다.
다형성을 통해 서로 다른 클래스의 객체들이 같은 인터페이스를 공유할 수 있으며, 이를 통해 유연하고 확장 가능한 코드를 작성할 수 있습니다.

 

 

4. 추상 클래스와 인터페이스
추상 클래스 (Abstract Class)
추상 클래스는 '추상적인' 클래스를 의미하며, 완전히 구현되지 않은 하나 이상의 추상 메서드를 포함합니다. 추상 메서드는 메서드의 선언만 있고, 구체적인 구현은 없는 메서드입니다. 추상 클래스 자체로는 객체를 생성할 수 없으며, 이를 상속받는 하위 클래스에서 추상 메서드들을 구현해야 합니다.

특징
하나 이상의 추상 메서드를 포함합니다.
객체를 직접 생성할 수 없습니다.
상속받은 클래스에서 모든 추상 메서드를 구현해야 합니다.
일반 메서드와 멤버 변수도 포함할 수 있습니다.
abstract 키워드를 사용하여 정의합니다.

 


abstract class Animal {
    abstract void makeSound();

    void breathe() {
        System.out.println("I am breathing.");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

 


인터페이스 (Interface)
인터페이스는 모든 메서드가 추상 메서드인 타입입니다. 인터페이스는 클래스가 구현해야 하는 '계약'과 같으며, 클래스는 인터페이스에 선언된 모든 메서드를 구현해야 합니다. 자바 8부터는 인터페이스에 default 메서드와 static 메서드를 포함할 수 있게 되어, 일부 구현을 포함할 수 있게 되었습니다.

특징
오직 추상 메서드만을 포함하거나, Java 8 이후부터는 default 메서드와 static 메서드도 포함할 수 있습니다.
인터페이스는 다른 클래스에 '구현될' 것을 명시합니다.
인터페이스는 implements 키워드를 사용하여 클래스에 구현됩니다.
다중 상속을 지원합니다.

 


interface Animal {
    void makeSound();
}

class Cat implements Animal {
    public void makeSound() {
        System.out.println("Meow");
    }
}


차이점
목적: 추상 클래스는 '이것은 무엇이다'의 관계를 나타내며, 주로 공통된 기능을 상속하는 데 사용됩니다. 반면, 인터페이스는 '이것을 할 수 있다'의 관계를 나타내며, 구현해야 할 기능의 명세를 제공합니다.
메서드 구현: 추상 클래스는 일부 메서드를 구현할 수 있지만, 인터페이스는 Java 8 이전에는 모든 메서드가 추상 메서드여야 했습니다.
다중 상속: 클래스는 여러 인터페이스를 구현할 수 있지만, 하나의 추상 클래스만 상속받을 수 있습니다.
이러한 차이점 때문에, 추상 클래스와 인터페이스는 서로 다른 상황과 목적에 따라 선택적으로 사용됩니다.

반응형

'자바(java)' 카테고리의 다른 글

9강: 스레드와 동시성 프로그래밍  (0) 2023.12.17
8강: 예외 처리와 파일 입출력  (0) 2023.12.17
6강: 메서드와 함수  (0) 2023.12.17
5강: 배열과 컬렉션  (0) 2023.12.17
4강: 조건문과 제어문  (0) 2023.12.17