본문 바로가기
자바 , 기타 공부/자바 공부

java 객체 지향 프로그래밍

by 임지혁코딩 2023. 12. 20.

추상화 -> 단순화 시켜 소프트웨어를 프로그램으로 만든다. 소프트웨어의 추상화라고 생각할 수 있다.

즉. 공동 필드를 묶어 하나의 클래스를 만드는 것을 의미한다.

 

객체지향 -> 변수 , 메소드를 그룹핑. 다른곳에 사용되기 쉽다

예시로, 방금 만들었던 request 또한 객체로 완성하여, 그 형태 그대로 전달할 수 있다. 

 

부품화-> 존재하는 개념은 아니지만, 특정 분야끼리 묶는다. 

ex) id 사람 다리 를 합쳐서 class로 생성시킨다. (추상화와 유사하다고 생각하면 될 것이다)

 

캡슐화 ,은닉화 -> 고급프로그래밍에 들었던 경험이다. 그 내부 구조를 알지 못해도 

객체를 사용할 수 있어야 한다. (ai에도 blackbox와 같은 개념으로 존재 , 즉 it개발의 핵심)  

 

인터페이스? 사용하는 이유. 가장 윗단에서, 클래스들을 유지하고 해당 인터페이스만 변경해서 사용하는 목적. 

 

클래스 class 

인스턴스 -> c1 

객체 class calculator 

 

중복의 제거 -> 동일한 코드를 중복하는 것은 유지보수 , 가독성, 재활용성을 낮춘다.

나는 동일한 코드를 계속 전반적으로 사용하려는 버릇이 있는데, 이를 줄여야 한다. 

함수 사용 - > refactoring . 같은 역할을 하나, 함수등을 사용하여 사용방법을 변화하는 것 

 

예시) 

public static void main (String[] args) {

 

Calculator c1 = new Calculator(); -> 객체 calculator를 생성하여, calculator라는 객체 c1생성

c1. setoprands(10,20); -> setter가 되겠다 . 인자값으로 10과 20을 전달 . 

c1.sum() -> 그 생성된 ,팔다리가 생긴 c1의 기능중 sum은 30, avg()는 15가 되겠다. 

 

class Calculator  { 

  int left , right; 

  public void setOprands(int left, int right) {

 this .left = left; 

this . right = right; }

public void sum() {

System.out.println(this.left+this.right) ; }

}

 

객체란 . 메소드의 집합이다. 

 

this.left와 = left에서 left의 차이. 

this. left는. c1을 가르킨다. c1의 left를 지정한다. 즉 , c1이라는 인스턴스를 의미한다.

<허나 this에 대한 개념은, 조금더 이해가 필요하다> 

 

int c라는 것은, 컴퓨터 메모리의 작동상 이미 저장된 int라는 공간에 c를 넣는다.

new도 마찬가지로, 객체를 위한 공간을 비워두고, set을해서 그곳에 값을 넣는다는 것이다.

 

--멤버 -- 

class에 직접 접근하여, 변수를 사용하는 경우가 존재한다. 

EX) class calculator { static double PI = 3.14 ; } 가 추가 되었다고 생각하자. 

system.out.println(c1.PI); PI를 선언한 적은 단한번도 없다. 하지만, PI는 클래스의 변수고 이미 정해진 , 더 큰 범위기 떄문에 접근 가능. 같은 의미로, Calculator.PI가 가능하다. 이미 pi라는 값을 calculator를 위한 공간을 생성시 완료했다. 

 

잠깐. static? 견고한 이라는 의미. class에 고정되어 있는 변수 or method이다.

가장 주의해야 할 것은, 메모리에 고정적으로 할당된다는 것이다. 고급 프로그래밍 강의에서 들었던, static이 먼저 생성된다 라는 의미는 . 객체 생성 이전에 static 메모리가 형성 된다는 것이고. 만약 static으로 method를 생성한다면? 

당연히 instance 변수를 사용할 수 없게 된다 . 

 

새 언어라고 겁먹지 말자. 하면 할수록 고프에서 했던 것들이다. 

 

인터페이스란? 

스프링을 사용하다보니, jparepository와 같은 경우에 이를 인터페이스로 형성함을 기억했다. 

class(객체/ 의미는 다르지만 크게 이해기 위해)가 있고, 그 객체가 인터페이스를 사용한다면, 그 객체는 인터페이스의 메소드를 구현함을 강제한다. 

객체를 사람으로 주로 비유하기때문에 , 사람이 사용하는 100가지 무기 를 생각해 이해했다. 

또 animal을 dog ,cat 기타 등등 class가 상속받을때도, 각각 extends시는 어디 class의 메소드인지를 구분할 수 없는 모호성을 지니게 된다. 허나 이때 interface Cat extends Animal. class MyPet implements Cat, Dog 과 같은 예시로 다중상속시, 모호성을 없애줄 수도 있다. 

 

*spring의 interface 문법과 같은 곳에 질문이 생겼고, 이를 백엔드 페이지의 repository탭에서 분석하겠다

 

*제네릭 

<>로 표현, 스프링 과정에서 알게모르게 제일 많이 사용된다. 

ArrayList<String> arrList = new ArrayList<String>(); 

arraylist인 arrlist의 , type이 string임을 미리 명시, 형변환을 사용하지 않게 한다.

당연히 type에 맞지않은 객체가 오면 에러가 발생한다. 

*오류가 뜨면 안좋은거 아닌가?  혼자서 공부할땐 에러가 발생하면 바꿔야되니까 문제가 있을 것 같지만, 

제너릭을 명시하지 않아 모든 코드 작성후 문제가 생기면 돌이킬 수 없다. 

 

스프링 예시

public ResponseEntity <ToDoResponse> create()

response entity라는 객체의 type이, todoresponse를 따를 것이다. 

 

--OPTIONAL 객체 -- 

 

핵심 -> NULL일 수 있는 객체의 생성

EX) OPTIONAL<TodoEntity> optionaldo = Optional.of(entity);

ro Optional.of(str)등등. 

of() 메서드 : 값이 null이 아닌 경우에만 Optional 객체를 생성
ofNullable() 메서드 : 값이 null인 경우에도 Optional 객체를 생성.
empty() 메서드 : 값을 갖지 않는 빈(empty) Optional 객체를 생성.