객체지향이란 정말 항해하는 느낌이다.방대하지만 재밌다.
인스턴스는 객체가 저장된 메모리를 가리키는 변수이고,
객체는 데이터를 저장할 객체변수이다.
Person p; // 객체(변수)
new Person(); // new연산자 생성자 메서드()
Person p = new Person(); // p : 인스턴스(변수) -> 객체를 메모리에 생성
기본 생성자는 생략가능(자기 자신을 메모리에 생성)
new 연산에 의해 호출
자신이 가지고 있는 멤버들을 메모리에 올려 객체를 생성
메서드 이름은 클래스이름과 동일
접근제한자가 public인 경우에만 호출
모든 클래스는 기본생성자를 가짐
객체의 초기화를 위해 사용
리턴 타입이 없다(그럼 void를 써야하나 ? -> "NO")
자신을 가리키는 객체변수, 참조변수, 포인터변수.
(객체가 생성된 후 자기 자신을 가리키는 레퍼런스 변수)
모델에 따라 다양한 모델을 만들어 사용
DTO, VO Model
데이터를 담는(이동)모델 => "바구니"역할/데이터를 묶을때 사용.
데이터를 하나로 묶어야 될 경우(데이터를 하나로 수집하는 역할)
DAO Model
데이터를 처리(DB)를 하는 모델 - db 테이블 조작해야함으로 CRUD 관여
(CRUD 동작을 가지고 있는 클래스, 비즈니스 로직을 처리하는 클래스)
- 여기서 비즈니스란 무엇일까 ?
- db에 잇는 데이터를 프로그램에서 가져와서 사용해야 되는 경우를 생각해보면?
Utility Model
도움(Utility)을 주는 모델
매개변수를 2개 이상 받을 때엔 더 입력해줘야함으로 아주 비효율적이다.
하나의 구조로 한 번에 넘기면 더 빠르고 효율 적인게 아닌가? -> 바구니
그래서 DTO, VO를 쓰는 것이다.
매개변수 처리에 있어 매우 깔끔해짐을 확인할 수 있다.
메서드를 통해서 private 접근 제어자에 접근하면 된다.
근데, 메서드에서 유효한 데이터여야만 변수에 접근할 수 있다.
그래서 일반적으로 메서드는 public으로 하는 것이다.
생략하면 같은 패키지 내에서만 접근 가능하다는 점 생각하기.
(클래스,변수 둘 다 같음)
다른 객체에게 자신의 정볼르 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것으로, 클래스 외부에서특정 정보에 접근을 막는다는 의미다.
정보은닉된 정보에 접근하는 방법은
setter, getter 메서드를 통해서 접근 가능하다.
this를 쓰지 않으면 매개변수로 넘어온 name을 그대로 넘어온 name으로 반환하는 행위이기 때문에, 삽질이다. 즉, this를 씀으로써 private에 접근해서 변수에 저장하는 것이다. (메서드라는 것은 자기 자신이 동작될 때, 만들어지는 이름이 참조가 되기 때문에 멤버 변수에 있는 private String name
을 가리킬 수 없어서 this
를 써서 클래스 내의 자기 자신의 private 변수에 접근함)
생성자 메서드의 초기화를 통해 접근
생성자 메서드를 오버로딩해서 초기화 가능
객체가 가지고 있는 값 전체를 문자열 형태로 넘겨줌
자바에서 배열은 객체로 취급한다. 연속된 데이터이기때문이다.
코드를 일일이 수정하기보단
replaceAll하면 편함.
클래스를 만들고, 사용하려면 객체를 생성하고 메모리에 할당해서 생성자를 써서 해야하는데, 메인(시작) 클래스는 객체생성없이(new)실행이 된다.
why?
이해가 안된다면, jvm에 대하여 포스팅했다. 읽고 오면 이해하는데 도움이 될 것입니다.
static이 없으면, hap()가 static-zone인 MethodArea에 로딩되지 않는다.
메모리적으로, static은 자동으로 main에 올라오는데 static이 아닌 메서드는 안 올라온다.
그래서 stitic-zone 메모리에 올라가는 static과 none-static 메서드는 서로 상호작용 할 수 없는 것이다.
그래서 상호 작용하려면, none-static 메서드에 객체를 생성(new)해서 생성자 메서드()를 호출해서 메모리에 로딩해줘서 상호작용하면 되는 것이다.
즉, static이 없으면 객체를 생성해서 호출하면 되는 것이고, static이 있으면 클래스 이름으로 호출하면 되는 것이다.
heap 영역은 자동으로 삭제가 안되기 때문에 gc가 접근해서 삭제.
Generation이 높은 것부터 gc로 메모리 정리함.
객체 생성을 못하도록 막고 싶을 때는, 클래스 이름 앞에 private으로 해주면 된다.