-
JAVA - 4 ( 객체지향 )study/java 2020. 7. 16. 19:48
절차지향 vs 객체지향
절차지향
물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법
언어
C언어
장점
- 컴퓨터의 처리구조와 유사해 실행 속도가 빠름
단점
- 유지보수가 어려움
- 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움
- 디버깅이 어려움
객체지향
실제 세계를 모델링하여 소프트웨어를 개발하는 방법.
프로그래밍에서 필요한 데이터를 추상화시켜 상태(필드)와 행위(메소드)를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
언어
Java
장점
- 코드의 재활용성이 높음
남이 만든 클래스를 가져와 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음
- 코딩이 절차지향보다 간편함 ( 유지보수 용이 )
절차 지향은 코드를 수정할 때 일일이 찾아서 수정해야 하는 반면에 객체 지향은 수정해야 할 부분이 클래스 내부에 멤버변수 혹은 메소드로 있기 때문에 해당 부분만 수정하면 됨
- 대형 프로젝트에 적합
클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러 회사에서 개발이 필요할 시 업무 분담이 용이
단점
- 처리 속도가 절차지향에 비해 느림
- 설계에 많은 시간이 소요됨
- 객체가 많으면 용량이 커짐
특징
1). 다형성
하나의 메소드나 클래스가 다양한 방법으로 동작 ex)오버로딩, 오버라이딩
상속과 구현을 통해 기능을 확장하거나 변경하는 것을 가능하게 해주고 같은 클래스 내의 코드 길이를 줄여줌
public interface Act{ void run(); }
public static class Person implements Act{ String name; public Person(String name) { this.name = name; } @Override public void run() { System.out.println(name + "은 사람이다. 사람은 달린다 고로 " + name + "은 달린다."); } } public static class Animal implements Act{ String name; public Animal(String name) { this.name = name; } @Override public void run() { System.out.println(name + "은 동물이다. 동물은 달린다 고로 " + name + "은 달린다."); } }
public static void main(String[] args) { //Act 객체에 Person, Animal의 인스턴스를 만들어서 넣어줌 Act person = new Person("재호"); Act animal = new Animal("호랑이"); person.run(); animal.run(); } //재호은 사람이다. 사람은 달린다 고로 재호은 달린다. //호랑이은 동물이다. 동물은 달린다 고로 호랑이은 달린다.
2). 상속
공통적으로 필요한 성격을 가장 기본적인 클래스로 정의해두고 상속받아서 사용.
중복의 최소화
3). 캡슐화
public, protected, private 라는 접근 지정자를 통해 클래스에 담는 내용 중 중요한 데이터나 기능을 외부에서 접근하지 못하도록 함.
객체 외부에서는 내부 정보를 직접 접근하거나 조작할 수 없음 ( getter/setter 이용 )
4). 추상화
실세계 객체를 소프트웨어 세계로 투영시키기 위해서 공통적인 속성과 기능들을 뽑아내는 작업
코드상에서 구현 부분을 제외한 오직 선언 부분만을 설계하는 것
5대 원칙 ( SOLID )
1). 단일 책임의 원칙 ( Single responsibility principle )
작성된 클래스는 하나의 기능만을 가지며 그 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는 데에 집중되어야 한다.
2). 개방 폐쇄의 원칙 ( Open/Closed principle )
수정이 일어나더라도 기존의 구성요소에서는 수정이 일어나지 않아야 하며 쉽게 확장이 가능하여 재사용할 수 있도록 주의해야 한다.
3). 리스코프 치완 원칙 ( LisKov substitution priciple )
부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 잘 구동되어야 한다.
4). 인터페이스 분리 법칙 ( Interface segregation principle )
클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 넣으면 안된다.
큰 덩어리의 인터페이스를 구체적이고 작은 단위들로 분리시킴으로써 꼭 필요한 메소드만 이용할 수 있도록 한다.
5). 의존관계 역전 원칙 ( Dependency inversion principle )
상위 모듈은 하위 모듈에 종속되어서는 안된다.
추상화는 세부사항에 의존하지 않는다. 세부사항은 추상화에 의해 달라져야 한다.
getter/setter를 왜 사용할까?
멤버 변수를 private으로 접근지정자를 설정하고 public 으로 setter, getter를 만들어줌
그렇게 되면 메소드를 통해 접근하기 때문에 메소드 안에서 매개변수와 같이 어떤 올바르지 않은 입력에 대해서 메소드 내에서 예외처리를 통해 제한하거나 조절할 수 있기 때문이다.
'study > java' 카테고리의 다른 글
[JAVA] Try-with-resources (0) 2020.07.30 JAVA - 5 (0) 2020.07.20 JAVA - 3 (0) 2020.07.16 JAVA - 2 (변수타입과 컬렉션) (0) 2020.07.15 JAVA - 1 ( JAVA 기초 ) (0) 2020.07.13