728x90
01. 객체자향 언어
- 핵심 개념: 캡슐화, 상속, 추상화, 다형성
- 객체지향 언어는 기존 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 것
- 코드의 재사용성 높고
- 유지보수가 용이
- 중복 코드 제거
02. class 와 object
- class: object의 설계도 또는 틀, object를 생성에 사용
- 설계도
- 변수 + 메서드
- 사용자 정의 타입
- object: 실제로 존재하는 것, 서로 관련된 변수의 묶음 + 메서드(실제 메서드는 객체에 존재하지 않는다.)
- 프로그래밍 순서: class 작성 후 class로부터 object를 생성하여 사용한다.
03. object 구성요소 - property(속성) 과 function(기능)
- object: 속성 + 기능
- 둘 중 하나만 있어도 상관없다.
- member: object가 가지는 속성과 기능을 멤버라고 한다.
- 속성 = variable = property = field = member 변수
- 기능 = method
class Tv{
// variable = property = field
String color;
boolean power;
// method = function
void power () { power = !poewer; }
void channelUp () {channel++;}
}
04. object and instance
- 인스턴스화: class로부터 객체를 만드는 과정
- 인스턴스: class로부터 만들어진 객체
- 어감차이 일뿐 같은 의미
- 책상은 객체이다 (o) 책상은 인스턴스다(x)
- 책상은 책상 클래스의 인스턴스이다 (o) 책상은 책상 클래스의 객체이다 (o)
06. 객체의 생성과 사용
Tv t = new Tv();
class_type 변수명 = 객체생성 생성자;
- 순서
- Tv t;
- 참조변수 생성 = class 설계도를 참조하기 위한 변수
- object memory 주소와 연결 -> 리모컨 역할 수행
- 오직 참조변수를 통해서만 object(==instance)를 다룬다.
- t = new Tv();
- new
- Tv class를 토대로 Tv object가 메모리의 빈 공간에 생성
- Tv object 가 저장된 memory 주소는 참조변수 t와 동일
- Tv();
- 객체 초기화
- new
- Tv t;
public class Main {
public static void main(String[] args) {
}
}
// class Name: Main
// main method: public static void main(String[] args) {}
- main method 사용 여부 - main method & new object & class 설계도 관계
- Tv 공장(main method)에서 설계도를 보고(class Tv) object(new Tv()) 만든다.
07. 객체의 생성과 사용 - 객체가 여러개 일 때
- 참조변수 여러개가 하나의 객체의 주소와 연결이 가능하다
- 참조변수 하나가 여러개 객체 주소와 연결은 불가능하다. -> 변수는 하나의 값만 저장이 가능하다.
Tv t1 = new Tv(); // 0x100 주소의 객체 생성
Tv t2 = new Tv(); // 0x200 주소의 객체 생성
t2= t1 // t2의 주소를 0x200 -> 0x100으로 변경
하나의 객체에 참조변수 2개가 연결이 됨
+ first t2의 객체는 GC(garbage collector)가 제거하여 메모리 유지
- 참고 자료
- class는 메모리의 어느 부분에 저장되는지
- class의 instance는 메모리의 어느 부분에 저장되는지
- instance의 참조변수는 메모리의 어느 부분에 저장되는지
08. 객체배열 == 참조변수 배열
Tv[] tvArr = new Tv[3];
- 참조변수의 배열이 3개가 생성
- value는 자동초기화 값이 null
- array만 생성하고 new Tv[3]; 있지만 아직 instance=object는 생성안됨
- 참조변수와 연결할 object 생성
09. class의 정의(1) - data & method 결합
- class의 정의 3가지
- 객체를 생성하기 위한 틀 (== 설계도)
- 데이터와 함수의 결합 (== 변수, 메서드)
- data = variable = property / function = method
- 사용자지정 타입(== 참조형 타입): 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
11. 선언위치에 따른 변수의 종류
// class 영역: method 영역을 제외한 모든 부분
class 선언class {
int iv;
Static int cv;
//method 영역
void method(){
System.out.print("method 영역에서는 다 들어올 수 있다.");
}
}
- class 영역 = main method가 없는 class의 method를 제외한 영역으로 선언문만 작성가능
- x = y + 4; 안됨
- System.out.print(); 안됨
- 변수 선언 & method 선언
- member variable - CV(class variable) / IV(instance variable) 존재
- method variable - LV(local variable) 존재
- method 영역 : 선언문 포함 모든 것을 작성가능 하다
- x = y + 4; 가능
- System.out.print(); 가능
class Name {
// 변수 선언부
int iv;
Static int cv;
// method 선언부
void method(){
int lv = 0;
}
}
- cv, iv, lv
- cv
- static
- 초기에 램에 올라가 있음 -> class 객체 생성 필요없이 사용 가능
- 모든 instance가 공통된 저장 공간을 공유
- iv
- instance 생성을 해야 존재함
- object는 iv의 집합체
- lv
- method 안에서만 존재하고 method 작업 끝날 시 사라진다.
- params 또한 lv
- for문 while문의 블럭 내에 선언된 지역 변수는 {} 안에서만 사용 가능하며, 블럭 벗어나면 소멸된다.
- cv
14. method
- method
- 반복 사용되는 문장들을 묶은 것
- 하나의 기능만 수행
- 입력값과 출력값이 있을 수도 없을 수도 있다.
15. method 선언부
// 반환타입 method이름(params 선언){
int add(int x, int y)
}
- params
- 너무 많을 시 : arrays || 참조변수 이용
- 반환타입
- return value(반환값)이 없을 시 return type은 void로 작성
16. method 구현부
// 리턴값은 선언문의 리턴타입과 동일해야함
int add(int x, int y){ // 리턴타입 int
int result = x + y;
return result; // 리턴 값
}
// void는 compiler가 자동으로 return; 넣어준다.
void method(){};
- method의 return 반환값 조건
- void 아닌 경우 반드시 return 포함
- return 값은 단 하나의 값만 반환 return은 해당 method를 종료하고 method를 부른 method에게 반환 값을 주는 것
- 반환값은 return type과 같거나 자동 형변환 가능한 것
- 선언부의 params와 구현부의 result는 lv 이다.
20. return문
- return문: 현재 실행중인 method를 종료하고 호출한 method(main method 쪽)로 돌아간다.
- 모든 method에는 적어도 하나의 return문이 있어야 한다.
22. call stack
- 호출스택: method의 작업에 필요한 메모리 공간을 제공
- 특징: method 수행 후 사용했던 메모리 반환 후 스택에서 제거 / 하나만 실행가능
26, 28. static method와 instance method
- instance method
- instance member(iv,im)와 관련된 작업 - iv를 사용, params 사용 가능
- static method
- instance 생성 필요 X, classNAME.methodNAME();으로 호출 iv 사용불가 -> parameter 사용
- static method란 객체 생성 없이 호출가능한 method이다.
- 언제 사용하나? iv를 사용하지 않는 method일 때 사용한다.
30. overloading
오버로딩 조건
- method 이름 동일
- parameter 개수 or type이 달라야 한다.
- return type 상관없음
32. 생성자(constructor)
- 생성자: instance가 생성될 때 호출되는 instance 초기화 method
- 특징
- 생성자는 리턴값이 없다. - void 생략 가능, return 값이 없기 때문
- 모든 class 에는 반드시 1개 이상의 생성자가 정의
- class에 생성자가 하나도 없을 시 compiler가 자동으로 기본 생성자 classname() {}; 을 추가하여 compile 한다.
- 1개의 생성자가 정의되면 최소 조건이 충족되었으므로 compiler는 기본 생성자를 자동으로 추가하지 않는다.
- 매개변수가 있는 생성자도 생성 가능
36. this()
- 같은 class의 다른 생성자를 호출할 때 사용
- 조건
- 생성자의 이름으로 class 대신 this를 사용한다
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 1st 줄에서만 호출 가능
- this vs this()와 다름
- this: instance 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
- this를 사용할 수 있는 것은 인스턴스멤버뿐이다. static에는 사용불가하다.
- iv lv 구별할 때 사용
38. 변수의 초기화
- 지역 변수
- 수동으로 초기화
- method는 stack에 빠르게 올라가고 내려가는데 올릴때 마다 0으로 초기화 하면 프로그램 성능일 떨어짐
- 인스턴스 변수
- 자동으로 초기화
- object, array의 내용들을 하나하나 수동으로 지정하기에 부담이 크기 때문
39, 40. 멤버변수의 초기화 - iv, cv
- 초기화 복잡도 순서
- 자동 초기화
- 명시적 초기화
- 초기화 블럭 및 생성자
- cv
- static{초기화 블럭 };
- iv
- { 초기화 블럭}; - 거의 안씀
- 생성자
- cv