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

김우경·2022년 2월 6일
0

Java

목록 보기
4/9
post-thumbnail

6장

가끔 헷갈리는 부분만 요약한 것입니다

1.2 객체지향언어

  1. 코드의 재사용성이 높다.
  2. 코드의 관리가 용이(유지보수)
  3. 신뢰성이 높은 프로그맹을 가능하게 한다. -> 제어자, 메서드를 이용해서 데이터를 보호하고, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작 방지
  • 너무 객체지향개념에 얽매여서 고민하기 보다는 기능적으로 완성한 후 객체지향적으로 코드를 개선!

2. 클래스와 객체

클래스 정의 : 객체를 정의해 놓은 것
클래스 용도 : 객체를 생성

객체 정의 : 실제 존재, 사물 또는 개념
객체 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
먼저 클래스를 작성한 다음, 클래스로부터 객체를 생성하여 사용

2.2 객체와 인스턴스

인스턴스(instance) : 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라 한다.

  • 인스턴스 와 객체를 엄격히 구분할 필요 없이 문맥에 따라 사용

객체 속성(property) : 멤버변수, 특성, 필드, 상태
객체 기능(function) : 메서드, 함수

ex)
속성 -> 멤버변수
기능 -> 메서드

2.4 인스턴스 생성

ex)
클래스명 변수명;
변수명 = new 클래스명();
Tv t; 클래스의 객체를 참조하기 위한 !참조변수선언!
t = new Tv(); 클래스의 객체 생성 후, !객체의 주소를 참조변수에 저장!

  • 인스턴스는 참조변수를 통해서만 다룰 수 있으며,
    참조변수의 타입은 인스턴스의 타입과 일치해야한다.
	Tv t1 = new Tv();
	Tv t2 = new Tv();
	t2 = t1;		// t1이 저장하고 있는 값(주소)을 t2에 저장한다.
					// 그렇게 되면 t2역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되어 t2가 원래 참조하고 있던 인스턴스는 더이상 사용할 수 없다
					// 카비지 컬렉터에 의해서 자동적으로 메모리에서 삭제된다.
					// 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더이상 사용되어질 수 없다.

3.변수와 메서드

class Variables
{
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(공유 변수)
void method()
{
int lv = 0; //지역변수
}
}

  • 클래스 변수의 생성시기는 클래스가 메모리에 올라갈 때
  • 인스턴스 변수의 생성시기는 인스터스가 생성되었을 때

클래스 변수
-> 인스턴스 변수와는 달리 인스턴스를 생성하지 않고도 언제라도 바로 사용가능
'클래스이름.클래스변수' ex) Variables.cv 와 같은 형식으로 사용
클래스가 메모리에 로딩 될 때 생성되어 종료까지 유지되며, public을 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수'의 성격을갖는다

3.3 메서드

'메서드' 는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

  1. 높은 재사용성(ex. Java API)
  2. 중복코드 제거
  3. 프로그램의 구조화

*메서드 정의 : 선언부, 구현부 작성

반환타입 메서드이름 (타입 변수명, 타입 변수명, ..)

int add(int a, int b)
{
int result = a+b;
return result;
}

*return문
메서드 반환타입이 'void'가 아닌 경우 구현분에 'return'이 반드시 포함되어야한다.
반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.

3.7 JVM의 메모리 구조

* cv : 클래스변수 , Iv : 지역변수 , iv : 인스턴스 변수

3가지 주요 영역
1. 메서드 영역 : 어떤 클래스가 사용되면, JVM은 해당 클래스(*.class)파일을 읽어서 저장
이 때, 그 클래스의 클래스변수도 함께 생성된다.

2. 힙 : 인스턴스들이 생성되는 공간

3. 호출스택 : 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.

첫 번째로 호출된 메서드 동작도중 다른 메서드가 들어오면 첫 번째 호출된 메서드는 수행을 멈추고,
두 번째 메서드가 수행된다. 동시에 첫 번쨰 메서드위에 두 번째 메서드가 쌓인다.
두 번째 메서드 수행이 끝나면 다시 첫 번째 메서드가 수행된다.
메서드 수행이 끝나면 스택에서 제거되며 메모리를 반환한다.

3.8 매개변수

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.

3.10 재귀호출

매서드의 내부에서 매서드 자신을 다시 호출하는 것
void method() {
    method();
}

void method(int n){
     if(n ==0)
       return;
    syso(n);

mehtod(--n);
}

재귀호출은 무한하게 자기 자신을 호출하기 때문에 조건문이 따라다닌다
반복문으로 구현할 수 있지만 논리적 간결함 때문에 사용하는 경우가 많다
반복문에 비해 속도가 느리다 -> 코드가 복잡해지면 간결함이주는 큰 이득을 위해 사용

3.11 클래스 메서드(static)와 인스턴스 메서드

클래스 메서드 : 인스턴스와 관계없는 메서드

인스턴스 메서드 : 메서드 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드

  • 반드시 객체를 생성해야만 호출할 수 있다.

클래스 영역에 선언된 변수를 멤버변수라 한다. 멤버변수 중에 static 이 붙은 것은 클래스변수
붙지 않은 것은 인스턴스변수라 한다. 멤버변수는 둘다 통칭하는 말이다.

설계
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
2. 캘래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
*static이 붙은 변수는 클래스가 메모리에 올라갈 떄 이미 자동적으로 생성
3.클래스 메서드는 인스턴스 변수를 사용할 수 없다.
4.메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

  • 메서드 호출시간이 짧아지므로 성능향상 인스턴스메서드는 실행 시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.

3.12 클래스 멤버, 인스턴스 멤버간의 참조 호출

인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상존재 -> 클래스파일을 읽을 때 먼저 생성됨
결국 클래스멤버 호출때는 인스턴스 멤버가 존재하지 않을 수도 있다.

인스턴스멤버간의 호출은 문제가없다. 하나의 인스턴스멤버가 존재하는 것은 다른 인스턴스멤버들도 모두 존재하기 때문이다.

  • Tip
    Call c =new Call();
    int result = c.method();

한 줄로

  • int result = c.Call().method();
    대신 참조변수를 선언하지 않았기 때문에 Call인스턴스는 더이상 사용 할 수 없다.

0개의 댓글