본문 바로가기
프로그래밍/Java

[Java] OOP의 4가지 특징

by 시간많은백수 2023. 10. 4.
반응형
 

💡OOP란

객체 지향 프로그래밍(OOP, Object-Oriented Programming)은 소프트웨어 개발 패러다임 중 하나로, 현실 세계의 객체(Object)와 그 객체들 간의 관계를 모델링하여 프로그래밍하는 방법론입니다.

OOP의 주요 특징은 다음과 같습니다.

 

📌 캡슐화 (Encapsulation)

캡슐화는 객체의 상태(멤버 변수)와 행동(메서드)을 하나로 묶고, 외부에서 직접 접근하지 못하도록 은닉하는 개념입니다. 즉, 데이터와 해당 데이터를 다루는 메서드를 함께 묶어 사용자가 객체의 상태를 직접 조작하지 못하게 합니다.

예시: 클래스 내부의 멤버 변수를 private로 선언하고, 외부에서 접근할 수 있는 메서드(getters와 setters)를 통해 상태를 조작하는 것이 캡슐화의 예입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class GetterSetterExercise {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("김자바");
        student.setAge(20);
        student.setGrade(6);
 
        String name = student.getName();
        int age = student.getAge();
        int grade = student.getGrade();
 
        System.out.println("학생 이름은 " + name + ", 나이는 " + age + "살, 학년은 " + grade + "학년입니다.");
    }
}
 
class Student {
    private String name;
    private int age;
    private int grade;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public int getGrade() {
        return grade;
    }
 
    public void setGrade(int grade) {
        this.grade = grade;
    }
}
 
 
cs

private으로 선언한 name,age,grade를 변경,수정하고 값을 불러오기 위하여 get,set 메서드를 만든 후 GetterSetterExercise 클래스에서 불러와 수정 후 출력하였다.

 

📌 상속 (Inheritance)

상속은 기존 클래스(부모 클래스 또는 슈퍼 클래스)를 기반으로 새로운 클래스(자식 클래스 또는 서브 클래스)를 생성하는 개념입니다. 자식 클래스는 부모 클래스의 멤버 변수와 메서드를 상속받아 재사용할 수 있습니다.

예시: 동물을 나타내는 Animal 클래스가 있을 때, 이를 상속받아 Dog 및 Cat 클래스를 생성하는 것이 상속의 예입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
class Animal {
    void eat() {
        System.out.println("Animal is eating.");
    }
}
 
class Dog extends Animal {
    void bark() {
        System.out.println("Dog is barking.");
    }
}
 
 
cs

Dog 클래스는 Animal 클래스를 상속받은 후 bark 메서드를 추가하였습니다.

📌 다형성 (Polymorphism)

다형성은 같은 이름의 메서드나 연산자가 다른 동작을 수행할 수 있는 능력을 의미합니다. 이는 메서드 오버로딩(Overloading) 및 메서드 오버라이딩(Overriding)을 통해 구현됩니다.

예시: 여러 동물 객체가 있을 때, 이들을 모두 다루는 공통 인터페이스를 정의하고, 각 동물에 대한 메서드를 호출할 때 다형성을 활용합니다.

 

  • 오버로딩(Overloading)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Shape {
    void draw() {
        System.out.println("Drawing a shape.");
    }
}
 
class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("Drawing a circle.");
    }
}
 
class Rectangle extends Shape {
    @Override
    void draw() {
        System.out.println("Drawing a rectangle.");
    }
}
 
 
cs

부모 클래스 Shape을 상속받은 Circle과 Rectangle 자식 클래스가 draw 메서드를 재정의 했습니다.

 

  • 오버라이딩(Overriding)
1
2
3
4
5
6
7
void display(int num1){System.out.println(num1)}              
void display(int num1, int num2){System.out.println(num1+num2)}
void display(int num1, double num2){System.out.println(num1+num2)}
 
display(10);       // display(int num1) 메소드 호출 -> 10
display(1020);   // display(int num1, int num2) 메소드 호출 -> 200
display(103.14); // display(int num1, double num2) 메소드 호출 -> 13.14
cs

한 클래스 내에서 같은 이름의 display 메서드를 인자의 개수만 다르게하여 재정의 했습니다.

 

📌 추상화 (Abstraction)

추상화는 복잡한 시스템에서 중요한 부분을 간추려서 표현하고, 불필요한 세부 사항을 숨기는 개념입니다. 즉, 중요한 기능과 속성을 강조하고 필요한 정보만 제공합니다.

예시: 자동차 클래스를 만들 때, 핵심 기능(운전, 정지)과 중요한 속성(엔진, 바퀴)을 강조하고, 내부 동작 메커니즘을 숨깁니다.

1
2
3
4
5
6
7
8
abstract class Vehicle {
    abstract void start();
 
    void stop() {
        System.out.println("Vehicle stopped.");
    }
}
 
 
cs

 

Vehicle 클래스는 추상 클래스로, start() 메서드는 하위 클래스에서 반드시 구현해야 합니다. stop() 메서드는 일반 메서드로 구현되어 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Car extends Vehicle {
    @Override
    void start() {
        System.out.println("Car started.");
    }
}
 
class Bike extends Vehicle {
    @Override
    void start() {
        System.out.println("Bike started.");
    }
}
 
 
cs

 

 

 

반응형