객체지향 프로그래밍의 4대 특성은 무엇인가요?

김상욱·2024년 11월 18일

객체지향 프로그래밍의 4대 특성은 무엇인가요?

캡슐화(Encapsulation)

  • 객체의 데이터를 보호하고, 데이터에 접근하는 방법(메서드)을 제공하는 원리. 객체 내부의 세부 구현을 외부로부터 숨기고, 필요한 부분만 외부에 노출.
  • 데이터(속성)와 메서드(기능)를 하나의 객체로 묶음.
  • 외부에서 직접 접근을 막기 위해 접근 제한자(public, private, protected)를 사용
  • 데이터 무결성을 보장하고, 코드의 유지보수를 용이하게 만듬.
class Person {
    private String name; // 캡슐화된 데이터
    public String getName() { // 데이터 접근을 위한 메서드
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

상속(Inheritance)

  • 기존 클래스(부모 클래스 또는 슈퍼 클래스)의 속성과 메서드를 새로운 클래스가 물려받는 원리.
  • 코드의 재사용성을 높이며 계층 구조를 형성해 객체 간의 관계를 명확히함.
  • 부모 클래스의 기능을 자식 클래스에서 재정의(오버라이딩)할 수 있음.
class Animal {
    void eat() {
        System.out.println("This animal eats food.");
    }
}
class Dog extends Animal {
    void bark() {
        System.out.println("The dog barks.");
    }
}

다형성(Polymorphism)

  • 동일한 이름의 메서드나 연산자가 상황에 다라 다른 방식으로 동작하는 것을 의미.
  • 오버로딩(Overloading) : 같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 다르게 정의
  • 오버라이딩(Overriding) : 상속받은 메서드를 자식 클래스에서 재정의
  • 실행 시점에 객체의 타입에 따라 적합한 메서드가 호출 -> 프로그램의 유연성과 확장성을 높임
class Animal {
    void sound() {
        System.out.println("Some sound");
    }
}
class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Bark");
    }
}

추상화(Abstraction)

  • 객체의 공통된 속성과 기능을 추출하여 필요한 것만 표현
  • 불필요한 세부사항은 숨기고, 중요한 정보만 노출. 추상 클래스와 인터페이스를 통해 구현.
  • 복잡성을 줄이고, 설계의 유연성 제공.
abstract class Shape {
    abstract void draw(); // 추상 메서드
}
class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("Drawing a circle");
    }
}

객체지향 프로그래밍(OOP)의 4대 특성에 대해 실습 가능한 아이디어를 Java와 Spring을 중심으로 설명드리겠습니다. 신입 취준생 입장에서 실습을 통해 이해를 심화하고, 포트폴리오로 활용할 수도 있는 방향으로 제안드릴게요.


1. 캡슐화 (Encapsulation)

실습 아이디어: 회원 관리 시스템

  • 목표: 데이터를 캡슐화하고, 접근 메서드를 통해 데이터 보호와 무결성 유지.

  • 예제:

    • 회원의 이름, 비밀번호를 캡슐화하고, Getter/Setter를 통해 접근.
    • Setter에 데이터 검증 로직 추가.
  • 실습 코드:

    public class Member {
        private String name;
        private String password;
    
        // Getter and Setter with validation
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            if (name == null || name.isEmpty()) {
                throw new IllegalArgumentException("Name cannot be null or empty");
            }
            this.name = name;
        }
    
        public String getPassword() {
            return "****"; // 비밀번호 노출 금지
        }
    
        public void setPassword(String password) {
            if (password.length() < 6) {
                throw new IllegalArgumentException("Password must be at least 6 characters long");
            }
            this.password = password;
        }
    }
  • Spring 실습:

    • Controller에서 @RequestBody로 JSON 입력을 받아 Member 객체로 변환.
    • 유효성 검사를 @Valid@NotNull로 처리.
    @RestController
    public class MemberController {
        @PostMapping("/register")
        public String register(@Valid @RequestBody MemberDto memberDto) {
            // Business Logic
            return "회원 등록 완료!";
        }
    }

2. 상속 (Inheritance)

실습 아이디어: 도형 클래스 계층 구조

  • 목표: 공통 속성과 메서드를 부모 클래스에 정의하고, 자식 클래스에서 확장.

  • 예제:

    • 부모 클래스 Shape를 정의하고, CircleRectangle에서 상속.
    • 자식 클래스에서 부모 메서드를 재정의.
  • 실습 코드:

    public class Shape {
        public void draw() {
            System.out.println("Drawing a shape");
        }
    }
    
    public class Circle extends Shape {
        @Override
        public void draw() {
            System.out.println("Drawing a circle");
        }
    }
    
    public class Rectangle extends Shape {
        @Override
        public void draw() {
            System.out.println("Drawing a rectangle");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Shape shape = new Circle();
            shape.draw(); // "Drawing a circle"
        }
    }
  • Spring 실습:

    • 공통된 로직이 있는 서비스 계층에서 BaseService를 정의하고, 이를 상속한 UserService, AdminService 등을 구현.
    • 예를 들어, 공통 CRUD 메서드는 BaseService에, 추가 기능은 자식 클래스에 작성.

3. 다형성 (Polymorphism)

실습 아이디어: 다양한 결제 수단 처리

  • 목표: 인터페이스나 부모 클래스를 활용해 다양한 구현체를 다룰 수 있도록 다형성을 적용.

  • 예제:

    • Payment 인터페이스를 정의하고, CreditCardPayment, PaypalPayment 구현체 작성.
    • 다형성을 통해 Payment 타입으로 처리.
  • 실습 코드:

    public interface Payment {
        void pay(double amount);
    }
    
    public class CreditCardPayment implements Payment {
        @Override
        public void pay(double amount) {
            System.out.println("Paid " + amount + " using Credit Card.");
        }
    }
    
    public class PaypalPayment implements Payment {
        @Override
        public void pay(double amount) {
            System.out.println("Paid " + amount + " using PayPal.");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Payment payment = new CreditCardPayment();
            payment.pay(100.0); // "Paid 100.0 using Credit Card."
        }
    }
  • Spring 실습:

    • Payment 구현체를 @Service로 등록하고, @Qualifier를 통해 원하는 구현체를 선택.
    @RestController
    public class PaymentController {
        private final Payment payment;
    
        public PaymentController(@Qualifier("creditCardPayment") Payment payment) {
            this.payment = payment;
        }
    
        @PostMapping("/pay")
        public String pay(@RequestParam double amount) {
            payment.pay(amount);
            return "결제 완료!";
        }
    }

4. 추상화 (Abstraction)

실습 아이디어: 게시판 관리 시스템

  • 목표: 추상 클래스를 활용해 공통 기능을 정의하고, 구체적인 기능은 자식 클래스에서 구현.

  • 예제:

    • Board 추상 클래스를 작성하고, NoticeBoard, QnaBoard에서 상속.
  • 실습 코드:

    public abstract class Board {
        public abstract void createPost(String content);
    
        public void commonFeature() {
            System.out.println("This is a common feature for all boards.");
        }
    }
    
    public class NoticeBoard extends Board {
        @Override
        public void createPost(String content) {
            System.out.println("Creating a notice post: " + content);
        }
    }
    
    public class QnaBoard extends Board {
        @Override
        public void createPost(String content) {
            System.out.println("Creating a Q&A post: " + content);
        }
    }
  • Spring 실습:

    • 추상화된 서비스 계층을 작성하여 특정 데이터베이스나 API 호출을 처리.
    • 예를 들어 NotificationService를 추상 클래스로 정의하고, SMS와 이메일 구현체를 작성.

실습 프로젝트 아이디어

  • 회원 관리 시스템
    • 로그인/회원가입 구현.
    • 캡슐화, 상속, 다형성 적용.
  • 쇼핑몰 결제 시스템
    • 다양한 결제 수단 처리.
    • 추상화와 다형성을 활용해 확장성 있는 구조 설계.
  • 게시판 시스템
    • 공지사항, Q&A 등 다양한 게시판 유형 구현.
    • 공통 기능은 추상 클래스로 관리.

0개의 댓글