빠른 변화를 쫓아가기 위해 개발됨
코드의 재사용성이 높고,유지보수 용이,중복코드 제거를 통해서 보완
OOP(Object-Oriented-programming)의 4가지 특징
캡슐화,상속,추상화,다형성(캡상추다)
클래스와 객체
클래스 : 객체를 정의해 놓은것, 객체를 생성하는데 사용
객체 : 실제로 존재하는것, 객체의 기능과 속성에 따라 용도가 다르다
클래스 -> 설계도, 객체 -> 제품 or 의자, 시디즈 or 노트북, lg그램
객체 = 속성(변수) + 기능(메서드) ex) 크기,길이,높이 ... + 크기 줄이기, 길이 늘리기, 높이 변경하기
class Tv{
String color; //변수
void chageColor(){} //메서드
}
객체 = 인스턴스를 대표하는 용어
인스턴스 = 특정 클래스로부터 생성된 객체
클래스에서 인스턴스화 하면 인스턴스(객체)
하나의 소스에는하나의 클래스가 기준이긴 한데 여러개도 가능하다
하나의 소스파일에는 하나의 public만 존재 가능하다
public class가 있으면 public 클래스랑 소스파일 이름이랑 동일해야한다
만약 public이 전부 안 붙어 있으면 소스파일이름을 클래스이름 아무거나 선택해서 사용
실행하기 위해서는 main메소드가 있는 클래스 이름이 소스파일 이름이어야 한다
클래스명 변수명;
변수명 = new 클래스명();
Tv t = new Tv();
변수(t)는 객체를 다루는 리모컨이라고 생각하자
멤버변수 사용 -> t.name = value
메소드 사용 -> t.method();
1 : 클래스 생성 -> 2 : 객체 생성,리모컨과 연결-> 3 : 객체 사용
GC(garbage collector)가 불필요하게낭비되는 메모리 알아서 제거해준다
객체 배열 == 참조변수 배열
클래스[] name = new 클래스[len];
name[idx] = new 클래스();
->객체 배열은 참조변수의 배열이기 때문에 배열안에 따로 초기화를 해야한다
클래스
1.설계도
2.데이터+함수 -> 구조체에서 발전 , 구조체는 다양한 데이터(변수)만 묶어둠
선언위치에 따른 변수의 종류
클래스는 크게 2가지 영역이 있다
선언만 가능-클래스 영역->
iv(instance value)-인스턴스 생성될때 생성된다 : 객체는 iv를 묶어둔것이다
cv(iv에서 static붙이기)-클래스가 메모리에 올라갈때 생성된다
초기화 가능-메서드 영역->
lv(local value), 메서드 종료되면 자동 삭제(GC)
공통적인 성질은 CV로 초기화
개별적인 성질은 IV로 선언
CV는
리모컨.name = value; 가 아니라
class.name = value; 이렇게 사용하자
메서드=문장들을 묶어둔것(하나의작업이 단위=하나의 메서드는 하나의 기능만 하도록 한다)
입력을 받아서 처리하고 결과를 반환(출력)
코드의 중복을 해결한다
관리 용이, 재사용 가능
메서드 영역에서 서로다른 메서드의 변수이름은 동일해도 상관없다 -> 어차피 지역변수
메서드의 호출->methodname()
int value = mm.add(1,2)가 있을때 mm.add(1,2)가 우선 3으로 변경된 후에 value에 저장된다
return을 만나명 호출하는 메서드가 그 값으로 변경되는것
그 후에 값이 대입 되는것
return-> void type일때는 컴파일러가 자동으로 생성해서 따로 안적어줘도 된다
호출 스택 (call stack)
메서드 수행에 필요한 메모리가 제공되는 공간
호출되면 스택에 할당, 종료되면 해제
아래에 있는게 먼저 호출된것
기본형 매개변수 -> READ ONLY
참조형 매개변수 -> READ & WRITE
기본형 매개변수
class Data{ int x;}
class Ex{
public static void main(String[] args){
Data d = new Data();
d.x =10;
changed(d.x);
}
static void changed(int x){
x=1000;
}
}
d->참조형 매개변수(리모컨)
changed에서 x는 기본형 매개변수
스택 변화과정
1. main
2. main에 d생성
3. 외부공간에 Data()객체 생성 및 x 생성
4. d에 Data()의 주소 할당 및 d가 가리키는 x를 10으로 초기화
5. changed 스택에 생성
6. changed 안에 x생성
7. 6번의 x에 1000 대입
8. changed 삭제
참조형 매개변수
class Data{ int x;}
class Ex{
public static void main(String[] args){
Data d = new Data();
d.x =10;
changed(d);
}
static void changed(Data d){
d.x=1000;
}
}
d->참조형 매개변수(리모컨)
changed에서 x는 기본형 매개변수
스택 변화과정
1. main
2. main에 d생성
3. 외부공간에 Data()객체 생성 및 x 생성
4. d에 Data()의 주소 할당 및 d가 가리키는 x를 10으로 초기화
5. changed 스택에 생성
6. changed 안에 main에 있는 d를 다시 생성
7. d가 가리키는 x를 1000으로 초기화
참조형 반환타입
class Data{ int x;}
class Ex{
public static void main(String[] args){
Data d = new Data();
d.x =10;
Data d2 = copy(d);
}
static Data copy(Data d){
Data tmp = new Data();
tmp.x = d.x;
return tmp;
}
}
스택 변화과정
1. main
2. main에 d생성
3. 외부공간에 Data()객체 생성 및 x 생성
4. d에 Data()의 주소 할당 및 d가 가리키는 x를 10으로 초기화
5. copy 스택에 생성
6. copy 안에 main에 있는 d를 다시 생성
7. 외부공간에 Data()객체 생성 및 x 생성 (3과 다름)
8. 3의 x값을 7의 x값에 대입
9. copy(d)에 tmp주소 대입 후 스택에서 copy 삭제
10. d2에 tmp주소 대입
static method vs instance method
iv->전역변수
객체 = iv 묶음
iv를 필요로 하는 메서드를 사용하기 위해선 객체가 iv묶음 이니까
객체를 먼저 생성하고 메서드를 사용해야한다
인스턴스 메서드 = iv 사용하는 메서드
인스턴수 생성 후, 참조변수.메서드() 이렇게 사용
스태틱 메서드 = iv 사용 하지 않는 메서드
객체 생성 없이 클래스.메서드() 이렇게 사용
static을 언제 붙여야 하는지
속성(멤버변수)
개별 속성 -> 인스턴스 변수
공통 속성 -> 클래스 변수
cv에만 static
기능(메서드)
인스턴스 변수를 사용하지 않는 메서드에 static
메서드간의 호출과 참조
iv,im ->객체 생성하면 메모리에 올라간다
cv,static method-> 항상 메모리에 올라가 있다
-->static method에서는iv,im사용불가
-->instance method에서는 cv 사용가능
★static method가 instance member(iv,im)를 사용할 수 없는 이유★
static method를 사용할때 객체(iv묶음)이 아직 생성 안 되어 있을 수도 있어서
오버로딩
하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는것
조건
1. 메서드 이름이 같아야 한다
2. 매개변수의 개수 또는 타입이 달라야 한다
생성자 = 인스턴스가 생성될때 호출되는 인스턴스(객체=iv 묶음)초기화 메서드
클래스 이름과 동일해야한다, 오버로딩 가능, 리턴이 없다(void 안붙임)
모든 클래스는 반드시 생성자를 가져야 하는데 기본생성자는 생략 가능
기본 생성자 = 매개변수가 없는 생성자
생성자가 하나도 없을때 컴파일러가 자동으로 추가해준다
->만약 생성자가 하나라도 있으면 기본 생성자도 생성해줘야 한다
매개변수가 있는 생성자가 있으면 한줄로 iv초기화 가능
Car c = new Car("w", "a", "4")
1. Car c -> 참조변수 c 생성
2. new -> 객체 생성
3. Car() -> 객체(iv) 초기화 = 생성자 호출
4. c=new -> 객체의 주소가 리모컨에 연결
생성자 this()
같은클래스 안에서 생성자가 생성자를 호출할때
반드시 this()를 사용해야 하고, 첫줄에서 this()를 사용해서 초기화 해야한다
Car(){
color ="w";
type="a";
door=4;
}
Car(String c, String g, int d){
color = c;
type = g;
door = d;
}
->
Car(){this("w","a",4);}
Car(String c, String g, int d){
color = c;
type = g;
door = d;
}
참조변수 this
생성자 this()와 전혀 다른것
this.name -> lv와 iv를 구별 할 때 사용한다
같은 클래스 내에서 lv,iv이름이 다르면 상관 없는데 같으면 꼭 사용해서 구분지어야 한다
class Math{
int a,b; // this.a, this.b가 진짜 이름 이때 this는 Math
Math(int a, int b){ //생성자
this.a = a;
this.b = b;
//iv와 lv를 구분하기 위해서 this 사용, this.a에서 사용된 a가 iv
}
int add(){
return a+b; //return this.a + this.b;
}
static int add(int a, int b){
return a+b; //클래스 메서드(static method)에서는 this 사용불가
//애초에 iv를 여기서 사용 할 수 없다, cv or lv만 사용가능
}
}
lv는 초기화 필수
iv,cv는 초기화 자동(0)으로 된다
명시적 초기화 = 사용
Engine e = new Engine(); 참조형 변수의 초기화 -> 객체 주소
복잡한 초기화
cv -> static {}
iv -> 생성자
class StaticBlock{
static int[] arr = new int[10];
static{
for (int i=0; i<arr.length;i++){
arr[i]=(int)Math.random()*10;
}
}
}
//static{}을 이용한 초기화
클래스 변수(cv) 초기화 시점 : 클래스가 처음 로딩될때 단 한번
인스턴스 변수(iv) 초기화 시점 : 인스턴가 생성될때마다
cv 초기화 끝나고 iv 초기화
자동(0)으로 먼저->간단 초기화(명시적 = 사용)->복잡한 초기화
'JAVA > 자바의 정석' 카테고리의 다른 글
자바의 정석 CH07 객체지향2-2 (1) | 2024.01.27 |
---|---|
자바의정석CH7-객체지향2-1 (0) | 2024.01.18 |
자바의 정석ch5 배열 (0) | 2024.01.16 |
자바의정석CH4 조건문과 반복문 (0) | 2024.01.16 |
자바의 정석 CH3 (0) | 2024.01.16 |