프로그래밍/JAVA

자바의 정석 6장 - 객체지향

나도 오늘부터 개발자?! 2022. 11. 3. 12:29

객체지향(OOP / Object Orianted Programing) 

유지보수가 쉽고, 중복코드를 제거 할 수 있음 / 절차지향은 그렇지 않음

 
객체지향의 핵심개념 : 객체지향의 개념과 규칙을 외우면서 공부하는게 중요
1.캡슐화
2.상속
3.추상화
4.다형성(객체지향을 이해하기에 가장중요함)
 

선언위치에 따른 변수의 종류와 생성시기

변수의 종류  
변수의 종류 선언위치  생성시기
클래스 변수 CV
(Class Variable)
 
클래스 영역
클래스가 메모리에 올라갈 때
(클래스는 자바 파일이 실행되면 자동으로 메모리에 올라감)
인스턴스 변수 IV
(Instance Variable)
인스턴스(객체)가 생성되었을 떄
객체 = iv 변수 묶음
지역변수 LV
(Local Variable)
 클래스 영역 외에 영역
(메소드, 생성자, 초기화블럭 내부)
변수 선언문이 수행되었을 때
선언문: int a = 0;
TIP: 객체를 생성하기 전에 클래스가 메모리에 먼저 올라간다
 
CPU  <-->  RAM  <--> 하드디스크(SSD,HDD
클래스 파일(exam.java 파일 등등)이 하드디스크에 파일형태로 저장이 되어 있는데 CPU가 클래스 파일을 읽어오려고 하드디스크에서 불러오면 CPU의 속도차이가 너무 빠르기 때문에 읽어올수가 없다. 그래서 증간에 RAM(메모리)라는 장치를 두고 하드디스크에 클래스 파일을 RAM(메모리에) 올리(loading)고 그제서야 CPU가 읽고 사용할 수 있게 된다. (CPU는 무조건 RAM하고만 작업한다.) CPU가 작업이 끝이나면 RAM에서 클래스 파일을 하드디스크에 저장(save)시킨다 , 만약 하드디스크에 작업이 끝나고 저장하지 않게되면 파일이 다 날아간다 그렇기 떄문에 하드디스크에 파일을 저장시키는 것이다. 
클래스가 메모리에 올라간다는 의미는 자바 파일이 실행이 되면 자동으로 메모리에 올라간다는 의미이다. 그래서 클래스 변수는 파일이 실행이 되면 자동으로 만들어진다. 
 
CV는 객체생성 없이 자동으로 사용가능 하지만 IV는 무조건 객체가 생성되야 사용가능
속성 - 개별적이면 IV(인스턴스 변수), 공통적이면 CV(클래스 변수)
 
Class Card {
 String kind;
 Static int width = 100;
}
 
Card c = new Card();
c.Kind = “”;
Card.width = “”;
 
 

스택(stack)이란? (호출스택(call stack) 중요함 )

밑이 막힌 상자를 뜻 하며, 상자안에 데이터를 넣으면 들어간 순서대로 아래에 차곡차곡 쌓인다. 꺼낼때는 마지막에 들어간 순서대로 차곡차곡 꺼내진다.
 
기본형 변수 : 값을 저장하는 공간 , 참조형 변수 : 값이 저장된 객체의 주소를 저장한다. 참조형 변수를 선언할 때 사용하는 변수의 타입은 클래스의 이름을 사용한다. 참조형 변수는 null 또는 객체의 주소를 값으로 가지며, 초기화를 할 때는 객체를 생성하는 연산자 new를 사용한다. EX) ADD obj = new ADD;
주소란? 메모리에 할당되어 있는 주소를 의미하며, 메모리안에는 주소별로 저장공간이 존재한다.
 
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.  = 기본형 매개변수란? int, char, byte,short 등등 / EX) ( int a , int b )
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. = 기본형 외에는 모두 참조형 매개변수 / EX) 객체 두개 생성  ( Data1 a, Data2 b)
왜? 기본형은 참조형은 데이터의 주소를 가져옴으로 
 
메서드에 반환타입이 기본형이면 값이 반환되고 참조형이면 주소를 반환한다.
 
인스턴스 메서드(객체 함수)
인스턴스(객체) 생성 후 “참조변수.메서드이름(); 호출
인스턴스 변수, 메서드와 관련된 작업을 하는 메서드
메서드 내에서 인스턴스 변수 사용 가능
 
static 메서드(클래스 메서드)
객체생성안함 “클래스이름.메서드이름(); 호출
인스턴스 변수,메서드와 관련 없는 작업을 하는 메서드
메서드 내에서 인스턴스 변수 사용불가
 
TIP: 메서드 내에 인스턴스 변수를 사용 할 필요가 없을때 static 메서드를 사용하자.
 
클래스 메서드는 인스턴스 변수를 사용할 수 없습니다.
왜냐하면 클래스 메서드는 클래스가 메모리에 올라가 있으면 바로 사용할 수 있지만 인스턴스가 생성되어야지만 사용할 수 있는 인스턴스 변수는 클래스 메서드가 메모리에 올라가서 사용할 수 있을때 꼭 인스턴스가 생성되었다고 보장할 수 없기 때문입니다.
 

오버로딩(과적하다)이란?

한 클래스 안에 같은 이름의 메서드 여러 개를 정의하는 것 , 보통 한 클래스에는 하나의 메서드만 정의하는게 좋다. 
 
오버로딩이 성립하기 위한 3가지 조건
1.메서드 이름이 같아야 한다.
2.매개변수 또는 타입이 달라야 한다.
3.반환 타입은 영향이 없다.
 
오버로딩에도 종류가 있는데 
메서드 오버로딩과 연산자 오버로딩이 있다. 하지만 자바에는 메서드 오버로딩만 거의 사용하기 때문에 오버로딩은 대부분 메서드 오버로딩이라고 생각하면 된다.
 

생성자란?

생성자는 인스턴스가 생성될때 호출되는 인스턴스 변수(IV)를 초기화하는 메서드입니다. 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 변수 생성시에 실행되어야 할 작업을 위해서도 사용됩니다. / 생성자 = 인스턴스 초기화
생성자 역시 메서드처럼 클래서 내에서 선언되며, 구조도 메서드와 유사하지만 리턴값이 없고, 생성자의 이름은 클래스의 이름과 같아야합니다.
인스턴스 생성시 수행할 작업(iv 초기화)에 사용 , 꼭 iv가 아니여도 가능함
예) Time t = new Time(); - 기본 생성자호출
Time t = new Time(12, 34, 56) - 생성자호출
 

생성자의 특징

1.클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴값이 없고, 생성자의 이름은 클래스의 이름과 같아야합니다.
2.리턴값이 없고 void를 붙이지 않는다.
3.모든 클래스는 반드시 한개 이상의 기본생성자가 있어야 한다. 하지만 생성자가 하나도 없으면 컴파일러가 알아서 기본생성자를 만들어준다.
TIP : 기본생성자란?  매개변수가 없는 생성자를 뜻 한다. 그리고 왠만하면 반드시 기본생성자는 항상 클래스안에 꼭 생성해주자 
객체이름() {} = 기본생성자를 → 클래스 안에 넣어주면 됨, 만약 상속을 받을 때 부모클래스에 기본생성자가 없으면  "Implicit super constructor @@@ is undefined(부모 생성자에 기본생성자가 없어)" 라는 오류가 난다  
 
 
생성자 사용법
Car c = new Car(”black”, “auto”, 4);
 
클래스 안에 사용 {
 Car() {} - 기본생성자 생성
 Car(String c, String g, int d) { 
 color = c;
 gearType = g;
 door = d; 
 }
}
 
this는 생성자와 인스턴스 메서드에서만 사용 가능하다.
 

생성자 this()란?

생성자에서 같은 클래스 내에 다른 생성자를 호출할때 사용합니다. 단, 생성자의 첫 줄에서만 다른 생성자를 불러 올 수 있다.
 
Car c = new Car(”black”, “auto”, 4);
 
클래스 안에 사용 {
 Car() {
  this(”white”, “auto”, 4) 
 } - 기본생성자 생성
 
 Car(String c, String g, int d) { 
  color = c;
  gearType = g;
  door = d; 
 }
}

참조변수 this란?

인스턴스(객체) 자신을 가리키는 참조변수로 인스턴스 메서드, 생성자 내부에서 사용가능하며, this에는 인스턴스의 주소가 저장되어 있다.
그리고 모든 인스턴스변수에는 this가 숨겨진 채로 존재하기 때문에 따로 this.변수이름으로 선언해주지 않아도 찾아준다. 
지역변수(LV)와 인스턴스 변수(IV)를 구분하는게 어렵기 떄문에 참조변수에 this를 사용해서 인스턴스 변수를 구분해 준다.
원래 참조변수.변수이름으로 사용하지만 번거로움이 있어 this.변수이름 사용한다 하지만 this도 같은 클래스에서 사용하면 생략이 가능하다 단, 이렇게 되면매개변수(지역변수,LV) 이름과 변수 이름이 같으면 절대 안된다
 
// 생성자의 매개변수(지역변수:LV)
Car(String c, String g, int d) {
 // 매개변수를 담는 그릇인 변수 color 등은 인스턴스 변수
 // color 는 iv , c 는 lv
 color = c;
 gearType = g;
 door = d; 
 
}
 
 
 

변수의 초기화

멤버변수(인스턴스변수: IV, 클래스변수: CV)는 자동으로 초기화 됨
 
지역변수(LV)는 수동으로 초기화 해야함
int i = 0; = 초기화
int i; = 초기화 아님
 
왜? 지역변수는 선언시점과 사용시점이 명확하기 때문에 컴파일러가 잡아줄 수 있어서 초기화를 해줘야 한다. 하지만 인스턴스 변수는 초기화 시점을 모르기 때문에 JVM에서 자동으로 초기화 시켜준다.
 
TIP : 지역변수는 메모리 구조에서 호출스택에 저장이 되는데 호출스택은 재사용이 빈번하게 이러나는데 빈번하다는 것은 짧은시간 동안 같은 메모리 공간을 여러메서드가 사용한다는 말이 된다. 그래서 메서드가 호출될 때마다 0으로 초기화되면 성능이 떨어진다!
성능을 올리기 위해서는 0으로 초기화 하는것이 아니라 새로운 값을 덮어쓰는 방식으로 처리 하는게 좋다.
 

멤버변수 초기화 방법

1.명시적 초기화 : 대입연산자(=)를 사용하여 초기화 하는것
ind door = 4;  // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수 초기화 (기본적으로 객체를 만들어서 초기화 해줘야 함 안그럼 null 값밖에 없어서 오류남)
 
2.초기화 블럭
사용이유 : 복잡한 여러문장을 넣을때 사용한다.
인스턴스 초기화 블럭 (IV) : { } // 잘 사용 안하며 생성자를 사용하여 초기화 한다.
클래스 초기화 블럭 (CV) : static { } 
3. 생성자 초기화
사용이유 : IV초기화를 할때 사용하며, 복잡한 초기화를 사용할때 사용한다 그리고 초기화 블럭에서 인스턴스 초기화블럭 : { } 을 잘 사용하지 않고 생성자를 사용한다!

'프로그래밍 > JAVA' 카테고리의 다른 글

[유튜브 : 뉴렉처님 강의] JDBC 1~ 12강 CRUD  (0) 2022.10.19
자바 객체지향(2)  (0) 2021.12.29
자바 객체지향 (1)  (0) 2021.12.28
자바의정석 Chap 5 배열 두둥!  (0) 2021.12.22
자바 조건문과 반복문  (0) 2021.12.20