읽은 책 정리/스프링 입문을 위한 자바 객체지향 원리와 이해

자바와 객체지향(OOP)

포포015 2021. 7. 16. 11:57

자바 메모리구조

객체는 유일무이하게 존재하는 실체이기때문에 속성에 값을 갖고, 클래스는 개념이면서 분류체계일뿐 속성에 값을 가질수없다.

 

눈으로 보고,느끼고,생활하는 현실세계처럼 프로그래밍 할수없을까? 라는 고민속에서 객체지향 개념이 탄생됨.

눈을 보여지는것, 만져지는것, 상상되는 모든것은 사물(object)이다.

(사물을 하나하나 이해하기보다는 사물을 분류(class)해서 이해하는것이 인간의 인지법이다.)

 

객체지향의 4대 특성 - 캡상추다

                         캡슐화 - 정보은닉

                         상속    - 재사용

                         추상화  - 모델링

                         다형성  - 사용편의

 

캡슐화  // 은닉화

- 관련이 있는, 변수와 함수를 하나의 클래스로 묶고, 외부에서 쉽게 접근하지 못하게 하는게 핵심

객체에 직접적인 접근을 막고 외부에서 내부의 정보에 직접접근하거나 변경할 수 없고,

객체가 제공하는 필드와 메소드를 통해서만 접근이 가능(getter, setter 또는 메서드).

(자바에서는 public, private, default , protected 4가지의 접근제어자를 제공하고 있다.)

public - 아무나 접근가능 어디에서나 접근가능.

private - 같은 클래스내에서만 접근가능

default - (접근제어자를 생략하면 default로 붙는 접근제어자) 같은클래스내, 같은 패키지내에 접근가능

protected - 같은 패키지에 속하는 클래스와 다른패키지에 속하는 자식클래스 허용

 

* 은행에서 잔고라는 변수가 있는데 public으로 선언이 되어있다면 누군가 악의적 또는 실수로

200만원이 들어있는 잔고를 0원으로 바꿀수도있다.

따라서 잔고라는 변수를 바로 접근할수없도록 private 으로 선언하고 데이터를 보호하는것이다.

 

 

 

상속

- 상위 클래스의 특성을 하위클래스에서 상속(특성 상속)하고 거기에 더필요한 특성을추가,

즉 확장해서 사용할수 있다는 의미

(상위클래스로 갈수록 추상화,일반화 되고 하위클래스로 갈수록 구체화됨)

(클래스명은 분류스럽게, 객체 참조변수명은 유일무이한 사물처럼 작명)

(a kind of 관계를 만족해야한다 (~의종류) )

(상위클래스는 물려줄특성이 풍성할수록좋고 (LSP),

(인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다 (ISP) )


*  객체지향언어의 꽃인거같다.

 현실로 비교하자면, 부모님이 자산을 형성해두고 그 자산을 자식에게 상속을해주면

 자식은 그 재산을 가지고 사용할수 있다. 

 

 

 

다형성

상위클래스와 하위클래스 사이에서도 다형성을 이야기할수있고,

인터페이스와 구현클래스도 이야기할수 있지만 가장 기본은 오버라이딩과,오버로딩이다.

(오버로딩 - 함수명 하나를 가지고 인자목록만 달리하면되니 함수명고민을 하지않아도됨 )

(오버라이딩 - 하위클래스가 재정의한 메서드를 알아서 호출해줌으로서 ,

형변환이나 instatnceof 연산자 사용해서 하위클래스가 무엇인지 확인안해도됨)

 

* 다형성을 상속을 통해 기능을 확장하거나 변경하는것을 가능하게해준다.

 기본은 오버라이딩, 오버로딩인데 상속을통해 물려받은 메서드를 자신의 생각대로 재창조해서 사용할수 있는것.

 

추상화

- 여러 객체에 공통적으로 사용되는, 사용되어야 하는 내용을 뽑아내는것을 말한다.

(애플리케이션 경계)

- 만들고자하는 웹은 어디에 사용될것인가?

- 관심영역에 대한 특성만

 

* 객체지향 프로그래밍을 하다보면 상태와 행위로 나뉘어서 짤수있다. (코드의유연함떄문에 OCP)

 A -> B를 의존하고 있으면 B가 변하면 A는 변한게없는데 B로 인해서 영향을받으면 안되니까,

추상화라는 개념을만들어서 A -> I ->B 식으로 중간에 I 에겐 상태만 선언해두고 B가 그 상태를 상속받아서 기능구현을 하는식으로 개발한다. 

현실로 예를들자면, 사람 -> 아반떼 이런식으로 의존적으로 바라보고 있으면, 

만약 사람 -> 아우디로 차가 변경된다면 자동차라는 큰틀은 비슷할텐데 사람은 차가 바뀌었다고 영향을받을테고

그를방지에, 추상화라는 개념을 통해 I 에게 차의 공통기능인 엑셀,브레이크 좌회전,우회전 이라는 개념은 

모든차가 있는개념이니 이런식으로 공통적인 내용을 추상화로 만들어두고, 차라는 존재는 그 추상화의 내용을

상속받아서 차가 바뀔떄마다 구현해서 사용하면 사람은 구현된 차에 의존하지않기떄문에 영향을 받지않는다.

 

 

참조변수의 복사

- 기본형자료형은 값자체( call by value )

- 침조형자료형은 주소값 ( call by address)

 

 * static(정적속성) - 객체가 아닌 클래스에 속해있음

 * 실무에서는 클래스의 인스턴스를 만들지않고, 사용하게되는 유틸리티성 메서드를 주로 정적메서드로 구성