오늘은 항해 1주차가 지나는 날이다...
사실상 1월 3일부터 시작을해서 2주일차 이긴 하지만,
어쨌든
제목에서 알 수 있듯이 오늘의 WIL은 바로 OO 이다.
이응이응이 아니라, 객체지향을 말하는 Oriented Object 이다..
오늘은 그래서 이번주차에 배웠던, 그리고 지금까지 공부를 했던 객체지향개념들을 정리해 보겠따.
일단 기준은 "자바의 정석" 기준이므로 이에 맞춰서 적어보겠다..
A.
그래서 왜 쓰는데..?
다음 3가지의 큰 이유를 들 수 있다.
A.
다음 4가지가 객체지향의 핵심적인 내용이다.
이는 뒤로 갈 수록 확실하게 나올 듯 하다.
" 객체지향 '개념' 을 일단 먼저 외우고 익숙해져야 한다고 강의에서 이야기를 했다.."
A.
다음과 같이 일단 외우면 나중에 비유를 생각하면서 개념이 잘 잡힐 것 같다.
클래스 == 제품의 설계도
객체 == 제품
정확하게 다시 보면 다음과 같다.
객체가 왜 필요할까?
- 객체를 사용하기 위해서 필요하다. (당연한 말..?)
객체를 사용하기 위해서???
- 객체를 사용한다는 것은, 객체 내의 속성과 기능을 사용하는 것이다.
참조변수??
객체를 사용하기 위해서 '리모콘' 과 같은 역할을 하는 친구이다.
이때 참조변수를 통해서 객체에게 접근하여 사용할 수 있다.
객체의 의미를 다시정의
이제 객체의 의미를 다시 정의하겠다.
여기부터 이제 객체는 "인스턴스 변수 (iv) " 의 집합이라고 정의할 것이다.
또한 객체는 객체마다 별도의 저장공간이 있다. ( 참조변수에는 이 객체의 별도공간의 '주소값' 이 저장되어있다.)
간단하게 이야기를 하면 다음과 같다.
앞에서 클래스는 객체를 위한 "설계도" 라고 정의하였다.
다시한번 정의를 하면 클래스 정의는 다음 3가지로 할 수 있다.
1번은 앞에서 이해를 하였고, 그렇다면 2번과 3번은 어떻게 된 것인지 한번 보자
앞에서 객체는 iv, 즉 인스턴스 변수들의 묶음이라고 이야기 했다.
그렇다면 이 변수들간의 차이점은 없을까?
물론 있다.
3가지로 나눌 수 있는데 다음과 같다.
그렇다면 이들이 구분되는 기준은?
이들은 '선언되는 위치'에 따라서, 즉 '영역'에 따라서 달라진다.
이때 클래스 영역에서는 선언문만 가능하다
각각의 생성과 소멸
- 인스턴스 변수(iv) 는 객체가 생성될 때 만들어진다.
- 클래스 변수(cv) 는 클래스가 메모리에 올라갈 때 한번만 만들어진다.
- 지역변수는 변수가 선언되면 생성되서, 메서드가 종료될때 자동으로 소멸한다.
클래스 변수랑 인스턴스 변수랑 Static 만 붙는 차이..?
클래스 변수(cv)
1. 객체 생성 없이 언제나 사용이 가능하다.
인스턴스 변수(iv)
1. 객체 생성이 무적권 필요하다.즉 인스턴스 객체가 생성이 되었을때 만들어진다.
이전에 배웠던 언어들에서 간단하게 "함수" 라고 생각하자.
이를 통해서 우리가 얻을 수 있는 점은
Method 호출
Method 흐름
메서드 수행할때 필요한 메모리가 제공되는 공간이다.
stack 개념은 다음과 같다.
stack
stack 의 특징
- 중간에 넣거나 중간에 있는 것을 꺼낼 수 없다.
- 메서드가 호출되면 호출 stack 메모리가 할당되고, 종료시에 해제된다.
- 아래 메서드가 그 위의 메서드를 호출한다
- 맨위의 메서드만 하나가 실행중이고, 나머지는 대기중이다.
기본형 매개변수
int, float, char, String, byte, boolean, double, long
값을 읽기만 할 수 있고(read only), 변경 불가
참조형 매개변수
기본형 매개변수를 제외한 모든 것들
값을 읽고 수정이 가능하다. (Read & write 가능)
매개변수로 참조형 변수를 전달할 경우 변수가 가리키는 객체의 주소값이 전달된다.
매개변수로 전달된 변수와 같은 객체를 가리키기 때문에 값의 변경이 간능하다.
참조형으로 반환하면...?
항상 반환값으로 객체의 주소값을 전달함을 인지해야 한다.
인스턴스 메서드와 static 메서드의 차이
- 인스턴스 변수(iv) 사용여부
- 인스턴스 객체 생성 여부
-> 이는 static 메서드가 수행될때 객체가 생성되었는지 알 수 없기 때문에 인스턴스 변수와 메서드를 사용할 수 없다.
-인스턴스 메서드를 사용하지 않는 메서드는 static을 붙일 수 있음.
오버로딩 : 한 클래스 안에 같은 이름의 메서드 여러개 정의
예시를 들면 더 이해가 쉽다. println() 같은 메서드가 오버로딩이다.
안에 매개변수가 int 형, char 형 다양하다.
오버로딩 성립조건 : 중요하니까 꼭 외워두자
1. 메서드 이름이 같아야 한다.
2. 매개변수와 갯수 또는 타입이 달라야 한다.
3. 반환타입은 상관 없다.
참고: method이름은 대부분 동사
자바도 연산자 오버로딩이 구현되어있다
(단, 직접 연산자 오버로딩은 할 수 없다)
생성자
기본 생성자
- 매개변수가 없는 생성자
- 생성자가 하나도 없으면 자동으로 생성됨.
일단 둘이 아예 상관이 없는 친구이다...
생성자 this()
참조변수 this
- 인스턴스 객체 자신을 가리키는 변수
- 인스턴스 메서드(생성자 포함)에서 사용가능
- 지역변수와 인스턴스 변수를 구별할 때 사용함
-> 지역변수와 인스턴스 변수의 이름이 같은 경우 this를 생략할 수 없음
(이름이 다르면 생략가능하지만, 보통은 같은 경우가 많으니까... (lv 와 iv를 구별..)- static 메서드에서는 사용 불가능하다
-> static 메서드가 사용되는 시점에 객체가 생성되었는지 확신할 수 없기 때문에
(static 멤버는 객체 생성없이도 사용이 가능하기 때문이다.) 사용 불가능하다.
변수의 초기화
이때 변수의 초기화는 3가지 정도로 나눌 수 있다.
참조형 변수의 초기화
참조형 변수에 들어갈 수 있는 것은 다음 2개와 같다.
이때 객체주소와 같은 경우는
객체를 만들어 넣어줬을때 초기화 이므로
엄밀히 말하면 명시적 초기화 이다.
2가지의 초기화 블럭이 있지만 첫번째 인스턴스 초기화 블럭은 잘 사용 안한다고 한다.
cv, iv 초기화 순서
멤버변수 초기화
다음주에는 객체지향 파트 2를 열심히 정리하고 뒷 부분도 마저 정리할 것이다.