객체 지향의 4가지 특징

2023. 10. 20. 02:16백엔드/JAVA

객체 지향 프로그래밍(Object-Oriented Programming, OOP)

객체 지향 프로그래밍이란 컴퓨터 프로그램을 객체(Object)라는 기본 단위로 나눈 후 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

 

클래스와 객체의 차이

  • 클래스(인스턴스)
    1. 객체를 만들기 위한 설계도 or 틀 
    2. 객체의 상태를 나타내는 필드와 행동을 나타내는 메소드로 구성 
  • 객체
    1. 클래스의 인스턴스라고도 불림 
    2. 소프트웨어 세계에 구현할 대상으로, 클래스에 선언된 모양 그대로 생성된 실체 
  • 인스턴스 
    1. 객체를 소프트웨어에 실체화 한것을 인스턴스라고 부름 
    2. 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체로 실체화된 인스턴스는 메모리에 할당 

 

객체지향의 4가지 특징 

1.  추상화(Abstration)

  • 객체의 공통적인 속성과 기능을 추출하여 정의하는것으로 추상클래스 또는 인터페이스로 구현 
  • 데이터 추상화와 제어추상화로 나누어짐 
  • 코드의 재사용성, 가독성을 높이기 때문에 생산성이 높아지고 에러가 감소

예시 코드 

/** 
공통적인 기능
1. 라인업 등록 
2. 게임 시작 
3. 우승 
*/ 

// super class 인터페이스 
public interface BaseballTeam {
    // public abstract 키워드 생락 가능
    public abstract void setLineUp();
    
    public void gameStart() {
		System.out.println("경기를 시작합니다.");
	}
    
    public void win() {
	    System.out.println("경기를 승리합니다.");
    }
    
}

// 하위 클래스 
public class Heroes implements BaseballTeam {
    @Override
    public void setLineUp() {
        System.out.prinln("선발투수 안우진이 등장합니다."); 
    } 
}

public class HanwhaEagles implements BaseballTeam {
    @Override
    public void setLineUp() {
        System.out.prinln("선발투수 문동주가 등장합니다."); 
    } 
}

 

2. 상속(Inheritance)

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소
  • 적은양의 코드로 새로운 클래스를 작성 할 수 있고, 코드를 공통적으로 관리할 수 있어 코드의 재사용성을 높이고 유지보수에 용이

예시 코드

/** 
공통적인 기능
1. 라인업 등록 
2. 게임 시작 
3. 우승 

각 객체별 다른 값을 가지고 있는것들 
1. 팀명 
2. 팀색상
*/ 

// super class 인터페이스 
public interface BaseballTeam {
    String teamName; 
	String teamColor; 
    
    // public abstract 키워드 생락 가능
    public abstract void setLineUp();
    public void ready(); 
    
    public void gameStart() {
		System.out.println("경기를 시작합니다.");
	}
    
    
    public void win() {
	    System.out.println("경기를 승리합니다.");
    }
}

// 하위 클래스 
public class Heroes implements BaseballTeam {
    @Override
    public void setLineUp() {
        System.out.prinln("선발투수 안우진이 등장합니다."); 
    } 
}

public class HanwhaEagles implements BaseballTeam {
    @Override
    public void setLineUp() {
        System.out.prinln("선발투수 문동주가 등장합니다."); 
    } 
}

// Main 실행
/**
각 클래스에서 BaseballTeam 클래스를 상속 받았기 때문에 해당 클래스에 선언되어 있는 필드(변수)와 메서드를 사용할 수 있음
*/
public class Main {
    public static void main(String[] args) {
        Heroes kiwoom = new Heroes(); 
        kiwoom.teamName = "키움 히어로즈"; 
        kiwoom.teamColor = "버건디";
        kiwoom.setLineUp(); 
        kiwoom.ready(); 
        
        HanwhaEagles eagles = new HanwhaEagles(); 
        eagles.setLineUp(); 
        eagles.ready(); 
    }
}

 

3. 다형성(Polymorphism)

  • 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질 
  • 같은 이름의 메서드나 연산자가 다른 클래스에서 다른 동작을 하도록 하는것 

메서드 오버라이딩(Method Overriding) 

: 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 것으로 자식 클래스는 부모 클래스의 메서드를 재활용하면서, 독자적인 기능을 추가 할 수 있음 

 

예시 코드

// super class 인터페이스 
public interface BaseballTeam {
    public void playWalkupSong() {
        System.out.prinln("기본 등장곡 재생."); 
    }
}

// 오버라이딩 - 메서드를 재정의 
public class Heroes implements BaseballTeam {
    @Override
    public void playWalkupSong() {
        System.out.prinln("키움 등장곡 재생."); 
    } 
}

public class HanwhaEagles implements BaseballTeam {
    @Override
    public void playWalkupSong() {
        System.out.prinln("한화 등장곡 재생."); 
    } 
}

 

메서드 오버로딩(Method Overloading)

: 같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용하는 것으로 메서드 이름을 동일하게 유지하면서도, 다양한 상황에서 유연하게 대응가능

 

예시코드

// super class 인터페이스 
public interface BaseballTeam {
    public void playWalkupSong() {
        System.out.prinln("기본 등장곡 재생."); 
    }
    
    public void playWalkupSong(songName) {
        System.out.prinln("지정 등장곡 [" + songName + "] 재생."); 
    }
}

// 오버라이딩 - 메서드를 재정의 
public class Heroes implements BaseballTeam {
}

public class HanwhaEagles implements BaseballTeam {
}

// 실행 클래스 
public class Main {
    public static void main(String[] args) {
        Heroes kiwoom = new Heroes(); 
        kiwoon.playWalkupSong(); // "기본 등장곡 재생." 
        
        
        HanwhaEagles eagles = new HanwhaEagles(); 
        eagles.playWalkupSong("홈런왕"); // "지정 등장곡 [홈런왕] 재생."
    }
}

 

4.캡슐화(Encapsulation)

  • 캡슐화란 서로 연관있는 속성과 기능들을 하나의 객체(클래스)로 묶고, 데이터를 외부로부터 보호하는것
  • 객체의 내부 구현 정보를 숨기고, 객체 간의 결합도를 낮춤으로써 코드의 유지보수성과 재사용성을 향상

캡슐화를 하는 이유 

  1. 데이터 보호(data protection) : 외부로부터 클래스에 정의된 속성과 기능들을 보호
  2. 데이터 은닉(data hiding) : 내부의 동작을 막추고 외부에는 필요한 부분만 노출

접근 제어자 종류 

* private < default < protected < public 순으로 접근을 허용

  • public : 제한 없음
  • protected : 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근이 가능
  • default : 접근 제어자를 별도로 설정하지 않은 변수나 메서드는 default 접근 제어자가 자동으로 설정, 동일 패키지 안에서만 접근 가능
  • private :  동일 클래스 안에서만 접근이 가능
public class Person {
    private int age;
    public String name;
    protected int height; 


    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }
    
}

// 실행 클래스 
public class Main {
    public static void main(String[] args) {
        Person person = new Person(); 
        person.setAge(10); // age에 바로 접근이 불가능 하기 때문에 setAge 메서드를 통해 클래스에 age값 할당
        persion.name = "안알랴줌"; // name은 public으로 바로 접근 가능 
    }
}