실제 세계는 사물로 이루어져 있으며 발생하는 모든 사건들은 상호작용이다.
1960년대 중반
에 시뮬라
라는 최초의 객체지향 프로그래밍언어 등장1980년대 중반
에 C++
라는 객체지향언어가 관심을 끔1995년
에 자바
발표1990년말
에 인터넷이 발전하면서 객체지향이 자리잡음기존의 언어에서 몇가지를 추가한것이다.
클래스 -> 인스턴스화 -> 인스턴스
클래스
로 부터 만들어진 객체
를 인스턴스
라 한다.
클래스란 객체를 정의한 것
객체는 속성과 기능의 집합
속성 - 멤버변수, 특성, 필드, 상태 (다같은말)
기능 - 텍스트, 메서드, 행위, 함수 (다같은말)
Tv t; // 메모리 공간 생성
t = new Tv(); // 힙메모리에 객체저장(힙에 변수들이 저장됨)
t.channel = 7; // 멤버변수 접근
// t -> Tv인스턴스에 접근한다.
// t변수를 통해서 Tv인스턴스를 조작할수 있다.
Tv t2 = new Tv();
// t2가 참조한 Tv인스턴스는 GC에 의해 삭제
// t, t2가 서로 같은 메모리를 바라본다.
t2 = t;
t2.channel = 10; // t, t2의 객체가 변한다.
class Tv {
String color;
boolean power;
int channel;
// 호출하면 스택에 쌓임
void power() {power=!power;}
void channelUp() {++channel;}
void channelDown() {--channel;}
}
변수 -> 배열 -> 구조체 -> 클래스
변수 종류 : 클래스 변수, 인스턴스변수, 지역변수
class Test {
int iv; // 인스턴스 변수
static int cv; // 클래스변수(스태틱변수, 공유변수)
void method() {
int lv = 0; // 지역변수
}
}
Test test; // 클래스 변수 생성
test = new Test(); // 인스턴스 변수생성
test.method(); // 지역변수 생성
클래스변수 : 클래스가 메모리에 올라갈때
Test test = new Test();
Test test2 = new Test();
test.cv=123;
System.out.println(test2.cv); // 123출력
인스턴스 변수 : 인스턴스가 생성될때
지역 변수 : 변수 선언문이 수행될때
메서드는 크게 선언부
, 구현부
가 있다.
1. 매개변수는 0개 또는 여러개
2. 매개변수는 지역변수로 구분 (메서드 종료시 소멸)
3. 메서드 return
은 선언된 타입과 같아야한다.
메서드는 return
or }
를 만나면 종료한다.
int max(int a, int b) {
if(a > b)
return a;
else
return b;
}
int max(int a, int b) {
int result = 0;
if(a > b)
result = a;
else
result = b;
return result;
}
2번째 코드처럼 return 값을 저장했다가 마지막에 쓰는게 좋다.
void add(int a, int b, int[] result) {
result[0] = a + b;
}
주소값을 이용해 add하는 로직인데 좋은방법인지는 모르겠다.
static메서드 : 참조변수
없이 클래스.메서드
로 호출가능
인스턴스 변수
호출불가
static 변수
호출 가능
구조
를 저장OutOfMemoryError
StackOverflowError
메서드
가 호출되면 콜스택에 push
다른 메서드
가 호출되면 콜스택에 push
다른 메서드
가 끝나면 콜스택에서 pop
메서드
가 끝나면 콜스택에서 pop
OutOfMemoryError: heap space
각 영역은 서로 구분된다.
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
기본형 매개변수 : 읽기만가능
참조형 매개변수 : 읽기 & 쓰기 가능
class Data {int x;}
class P {
void change(int x) {
x = 10;// 기본형 매개변수
}
void change2(Data d) {
d.x = 100; // 클래스를 이용한 참조형 매개변수
}
void change3(int[] x) {
x[0] = 1000; // 배열을 이용한 참조형 매개변수
}
}
자기자신을 계속 호출하는 메서드
static
이 붙어있음 클래스이름.매서드이름
으로 호출static변수
하고만 작업가능인스턴스 변수
하고만 작업가능멤버 변수 : static변수, 인스턴스변수
메서드에 static을 붙히는것
을 고려하자MathClass를 보면서 공부하면 좋을듯하다.
같은클래스인 경우 인스턴스멤버 없이도 호출가능
멤버 : 메서드, 변수 합친것
인스턴스 멤버 -> 클래스 멤버 호출가능
클래스 멤버 -> 인스턴스멤버 호출할땐 인스턴스가 생성되있어야 한다.
int sum = new Math().sum(1,2);
식으로 사용가능하다.
하나의 이름으로 여러개 메서드를 정의하는 것
println()
메서드가 대표적인 예다.
인스턴스 초기화 메서드
1. 생성자는 클래스 이름과 같아야한다.
2. 생성자는 리턴값이 없다.
3. 매개변수를 설정할 수 있다.
4. new 연산자가 인스턴스를 생성한다. (생성자가 인스턴스를 생성하지 않는다.)
Card c = new Card();
1. 연산자 new에 의해서 heap메모리에 Card클래스의 인스턴스 생성
2. 생성자 Card()실행
3. 연산자 new결과로 생성된 Card 인스턴스의 주소가 c에 저장
클래스
는 1개이상 생성자
가 있어야한다.코드에 생성자가 없을때
만 컴파일러가 자동생성
한다.class Test {
public Test(int a) {}
}
위 코드는 Test t = new Test(1);
형식으로만 호출가능하다.
매개변수를 넣으면 코드가 짧아진다.
this
로 생성자에서 다른 생성자를 호출가능하다.
class Test {
int a=10;
int b=20;
int c=30;
Test(int a, int b, int c) {
this.a = a; // this를 사용하면 지역변수, 없으면 매개변수
b = b; // 둘다 매개변수
c = this.c; // 이렇게도 가능하다.
}
Test() {
this(1,2,3); // 생성자 호출
}
}
197p 맨 밑문단
사실 생성자를 포함한 모든 인스턴스 메서드에는 자신이 관련된 인스턴스를 가리키는 참조 변수 this가 지역변수로 숨겨진채로 존재한다.void sum(int a, int b) {return a + b;} void getNumber() {return number;} // 지역변수 number
sum(int a, int b)
에는 해당되지 않고getNumber()
같이 지역변수number
를 가져오면 앞에 자동으로this
가 붙어서this.number
로 호출되는 말같다.
this
: 자신의 인스턴스를 가르키는 참조변수this()
: 다른 생성자를 호출할때 사용인스턴스를 복사하는 기법이다.
class Car {
...
Car(Car c) {
color = c.color;
gearType = c.gearType;
door = c.door;
}
}
~~
Car c1 = new Car();
Car c2 = new Car(c1); // 복사한다.
method안에 지역변수는 자동초기화가 안되서 반드시 초기화후 사용한다.
멤버변수(class안에 변수)는 선택이다.
int x = 1
class Test {
static int staticVar = 0; // # 2번
int var = 0; // #4번
// static 변수를 로직으로 초기화하는데 사용한다.
// 클래스가 처음 메모리에 올라갈때 수행
static { // # 3번 (static블록이 우선순위가 높다)
for (int i = 1; i <= 10;i++) {
staticVar += i;
var += i; // 안된다
}
}
// 인스턴스 변수를 로직으로 초기화하는데 사용한다.
// 인스턴스 생성마다 수행
{ // # 5번, #7번
for (int i = 1; i <= 10;i++) {
staticVar += i; // 인스턴스를 만들수록 값이 누적증가한다.
var += i;
}
}
}
Test t = new Test(); // #1번
Test t2 = new Test(); // #6번
실행순서는 #n번
으로 작성
인스턴스 초기화블럭대신 생성자를 자주쓴다.
모든 생성자에 공통적이면 인스턴스 초기화 블럭을 쓴다.
클래수 변수 : 클래스의 최초로딩
인스턴스 변수 : 인스턴스가 생성될때마다
클래스변수의 초기화 순서 : 기본값 -> 명시적초기화 -> 클래스초기화블럭
인스턴스변수의 초기화 순서 : 기본값 -> 명시적초기화 -> 인스턴스초기화블럭 -> 생성자
클래스 멤버 호출, 인스턴스를 생성등 클래스 호출할때 메모리에 로딩
프로그램이 시작될때 메모리에 로딩
요약
메서드에 static을 붙히면 일반메서드보다 빠르다.
코드에 생성자가 없으면 컴파일러가 생성해준다.
static변수는 클래스(인스턴스가 아니다)가 메모리에 올라갈때 생성되서 프로그램 종료에 소멸된다.
static은 instance가 없어도 돌아간다.