객체 지향의 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)
- 캡슐화란 서로 연관있는 속성과 기능들을 하나의 객체(클래스)로 묶고, 데이터를 외부로부터 보호하는것
- 객체의 내부 구현 정보를 숨기고, 객체 간의 결합도를 낮춤으로써 코드의 유지보수성과 재사용성을 향상
캡슐화를 하는 이유
- 데이터 보호(data protection) : 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉(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으로 바로 접근 가능
}
}
'백엔드 > JAVA' 카테고리의 다른 글
JVM 그리고 코드를 실행하는 과정에 대하여 (0) | 2024.02.03 |
---|---|
멀티모듈 적용하기 (2) | 2024.01.18 |
repeat() : 문자열 반복 (0) | 2023.12.02 |
오버라이딩을 구현할 때 @Override 어노테이션을 사용하는 이유 (1) | 2023.10.24 |
인터페이스가 가지고 있는 객체 지향의 특징 (1) | 2023.10.21 |