객체지향

ChoRong0824·2025년 1월 6일
0

Java

목록 보기
35/41
post-thumbnail

객체지향이란 정말 항해하는 느낌이다.방대하지만 재밌다.
인스턴스는 객체가 저장된 메모리를 가리키는 변수이고,
객체는 데이터를 저장할 객체변수이다.

Person p; // 객체(변수)
new Person(); // new연산자 생성자 메서드()
Person p = new Person(); // p : 인스턴스(변수) -> 객체를 메모리에 생성

생성자메서드와 this

기본 생성자는 생략가능(자기 자신을 메모리에 생성)

생성자 메서드는 ?

new 연산에 의해 호출
자신이 가지고 있는 멤버들을 메모리에 올려 객체를 생성
메서드 이름은 클래스이름과 동일
접근제한자가 public인 경우에만 호출
모든 클래스는 기본생성자를 가짐
객체의 초기화를 위해 사용
리턴 타입이 없다(그럼 void를 써야하나 ? -> "NO")

this

자신을 가리키는 객체변수, 참조변수, 포인터변수.
(객체가 생성된 후 자기 자신을 가리키는 레퍼런스 변수)

객체가 만들어지는 메모리 영역은 heap memory


모델

모델에 따라 다양한 모델을 만들어 사용

  1. DTO, VO Model
    데이터를 담는(이동)모델 => "바구니"역할/데이터를 묶을때 사용.
    데이터를 하나로 묶어야 될 경우(데이터를 하나로 수집하는 역할)

  2. DAO Model
    데이터를 처리(DB)를 하는 모델 - db 테이블 조작해야함으로 CRUD 관여
    (CRUD 동작을 가지고 있는 클래스, 비즈니스 로직을 처리하는 클래스)

    - 여기서 비즈니스란 무엇일까 ?
    - db에 잇는 데이터를 프로그램에서 가져와서 사용해야 되는 경우를 생각해보면?
  3. Utility Model
    도움(Utility)을 주는 모델


매개변수를 2개 이상 받을 때엔 더 입력해줘야함으로 아주 비효율적이다.
하나의 구조로 한 번에 넘기면 더 빠르고 효율 적인게 아닌가? -> 바구니
그래서 DTO, VO를 쓰는 것이다.

매개변수 처리에 있어 매우 깔끔해짐을 확인할 수 있다.


객체를 접근하는 권한

접근제어

  • 객체 상호간에 접근을 제어하는 방법(클래스 상호간에)


메서드를 통해서 private 접근 제어자에 접근하면 된다.
근데, 메서드에서 유효한 데이터여야만 변수에 접근할 수 있다.
그래서 일반적으로 메서드는 public으로 하는 것이다.


생략하면 같은 패키지 내에서만 접근 가능하다는 점 생각하기.
(클래스,변수 둘 다 같음)


잘 설계된 VO 클래스 ?

정보 은닉

다른 객체에게 자신의 정볼르 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것으로, 클래스 외부에서특정 정보에 접근을 막는다는 의미다.

정보은닉된 정보에 접근하는 방법은
setter, getter 메서드를 통해서 접근 가능하다.
this를 쓰지 않으면 매개변수로 넘어온 name을 그대로 넘어온 name으로 반환하는 행위이기 때문에, 삽질이다. 즉, this를 씀으로써 private에 접근해서 변수에 저장하는 것이다. (메서드라는 것은 자기 자신이 동작될 때, 만들어지는 이름이 참조가 되기 때문에 멤버 변수에 있는 private String name을 가리킬 수 없어서 this를 써서 클래스 내의 자기 자신의 private 변수에 접근함)

생성자를 이용한 객체 초기화

생성자 메서드의 초기화를 통해 접근

객체 생성시 원하는 값으로 초기화

생성자 메서드를 오버로딩해서 초기화 가능

  • 오버로딩된 생성자가 있다면, 기본생성자는 무조건 만들어 둬야함.
    (컴파일러가 생성해주지 않기 때문)

toString() 메서드로 객체 값 출력

객체가 가지고 있는 값 전체를 문자열 형태로 넘겨줌

  • toString()메서드를 이용해서 객체가 가지고 있는 모든 값을 리턴해줌
    (toString()은 객체 불러올 때 생략될 수도 있음)

배열과 클래스의 관계

자바에서 배열은 객체로 취급한다. 연속된 데이터이기때문이다.

객체 배열

복 붙 했을때, 가끔 깨지는 경우

코드를 일일이 수정하기보단

replaceAll하면 편함.


static과 메모리

클래스를 만들고, 사용하려면 객체를 생성하고 메모리에 할당해서 생성자를 써서 해야하는데, 메인(시작) 클래스는 객체생성없이(new)실행이 된다.
why?

  1. jvm이 실행할 클래스를 찾는다. 찾았다면 ?
  2. static 키워드가 붙어있는 멤버들을 정해진(static-zome)위치에 한 번 자동으로 로딩한다.
    -> static 멤버들은 클래스를 사용하는시점에서 딱 한 번 메모리에 로딩된다는 점이 중요하다
    -> 여기서는 main() 메서드가 static이기 때문에 메모리에 자동으로 로딩 한다.
  3. jvm이 static-zone에서 main()메서드를 호출한다.
  4. 호출된 메서드를 Call static Fame Area(Stack Area)에 push(기계어코드를 넣고) 한 뒤 동작을 시작한다.

이해가 안된다면, jvm에 대하여 포스팅했다. 읽고 오면 이해하는데 도움이 될 것입니다.

static이 없으면, hap()가 static-zone인 MethodArea에 로딩되지 않는다.


static과 none Static

메모리적으로, static은 자동으로 main에 올라오는데 static이 아닌 메서드는 안 올라온다.
그래서 stitic-zone 메모리에 올라가는 static과 none-static 메서드는 서로 상호작용 할 수 없는 것이다.

그래서 상호 작용하려면, none-static 메서드에 객체를 생성(new)해서 생성자 메서드()를 호출해서 메모리에 로딩해줘서 상호작용하면 되는 것이다.

즉, static이 없으면 객체를 생성해서 호출하면 되는 것이고, static이 있으면 클래스 이름으로 호출하면 되는 것이다.


JVM이 사용하는 메모리 영역

heap 영역은 자동으로 삭제가 안되기 때문에 gc가 접근해서 삭제.
Generation이 높은 것부터 gc로 메모리 정리함.


객체 생성과 static의 관계 ?

객체 생성을 못하도록 막고 싶을 때는, 클래스 이름 앞에 private으로 해주면 된다.


class, object, instance의 상호관계

profile
백엔드를 지향하며, 컴퓨터공학과를 졸업한 취준생입니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글