java/자바의 정석

자바의 정석 객체6과

#풀닢 2023. 1. 1. 21:17

이것은 내가 공부하려고 쓰는 요약입니더.

자바의 정석 객체 6장을 토대로 작성되었삼.

 

객체지향 언어

기존의 프로그래밍언어와 다른 전혀 새로운 것이 아니라 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 보다 발전 된 것

객체지향

1.코드의 재사용성이 높다.

새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성 가능

2.코드의 관리가 용이하다.

코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경 가능,유지보수 가능

프로그램의 개발과 유지보수에 드는 시간과 비용을 획기적으로 개선

3.신뢰성이 높은 프로그래밍이 가능

제어와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하게 함, 코드의 중복을 제거하여 코드의 불일치를 인한 오동작 방지

 

클래스의 정의- 클래스란 객체를 정의해 놓은 것 / 실제로 존재하는 것, 사물 또는 개념

클래스의 용도- 클래스는 객체를 생성하는데 사용, 객체가 가지고 있는 기능과 속성에 따라 다르다.

 

유형의 객체- 책상,의자,자동차,tv와 같은 사물

무형의 객체- 수학공식,프로그램 에러와 같은 논리나 개념

 

우리가 원하는 기능의 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생성하는 과정이 선행되어야 함.

객체TV TV설계도(클래스) -> TV설계도(클래스)는 단지 TV라는 제품(객체)를 만드는데만 사용 됨

 

객체는 속성과 가능, 두 종류의 구성요소로 이루어져 있다. 일반적으로 객체는 다수의 속성과 다수의 기능을 가진다.

객체는 속성과 기능의 집합

객체가 가지고 있는 속성과 기능을 그 객체의 멤버(구성원)이라고 한다.

 

속성 크기,길이,높이,색상,볼륨,채널 등
기능 켜기,끄기,불륨 높이기,불륨 낮추기,채널 변경하기 등

속성 -> 멤버변수

기능 -> 메서드

 

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

 

책상은 객체다.

책상은 책상 클래스의 인스턴스다.

 

             인스턴스화

클래스 -------------> 인스턴스(객체)

 

한 파일에 여러 클래스 작성하기

 

클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언

변수명 = new 클래스명(); // 클래스의 객체를 생성 후 , 객체의 주소를 참조변수에 저장

Tv t;

TV t = new TV();

t.channel = 7;

t.channelDown();

 

class Tv {
//Tv의 속성(멤버 변수)
String color;
boolean power;
int channel;

void power() { power =!power; }
void channelUp() { ++channel;}
void channelUp() { --channel;}
}

객체 배열

많은 수의 객체를 다뤄야할 때 배열로 다루면 편리할 것이다.

객체 역시 배열로 다루는 것이 가능하며 이를 '객체배열'이라고 한다.

객체 배열 안에 객체가 저장되는 것이 아니고, 객체의 주소가 저장된다.

Tv tv1,tv2,tv,3 -> Tv[] tvArr = new Tv[3];

 

tvArr[0] = new Tv();

tvArr[1] = new Tv();

tvArr[2] = new Tv();

 

Tv[] tvArr = { new Tv(),new Tv(),new Tv() };

이렇게 한 줄로 간단히 할 수 있음

int [] hour = new int[3];

int [] minute = new int[3];

float[] second = new float[3];

위와 같이 배열로 처리하면 다뤄야 하는 시간 데이터의 개수가 늘어나더라도 배열의 크기만 변경해주면 되서

변수를 매번 새로 서언해줘야 하는 불편함과 복잡함은 없어졌다.

이렇게 시,분,초를 하나로 묶는 사용자정의타입, 즉 클래스를 정의하여 사용해야 한다.

 

다뤄야할 객체가 많을 때는 for문을 사용

 

변수 - 하나의 데이터를 저장할 수 있는 공간

배열 - 같은 종류의 여러 데이터를 하는 집합으로 저장할 수 있는 공간

구조체 - 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간

클래스 - 데이터와 함수의 결합(구조체 + 함수)

 

선언위치에 따른 변수의 종류

변수의 종류 선언위치 생성시기
클래스 변수(class variable) 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수(instance vairable) 인스턴스가 생성 되었을 때
지역 변수(local variable) 클래스 영역 이외의 영역
(메서드, 생성자,초기화 블록 내부)
변수 선언문이 수행 되었을 때

1. 인스턴스 변수- 클래스 영역에 선언이 되며, 인스턴스를 생성할 때 만들어 진다.

인스턴수 변수의 값을 읽어 오거나 저장하려면 먼저 인스턴스를 생성해야 한다.

인스턴스마다 별도의 저장공간을 가지므로 서로 다른 값을 가질 수 있다.

인스턴스마다 고유한 상태를 유지해야 하는 속성의 경우, 인스턴스 변수로 선언한다.

 

인스턴스 변수는 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지 할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 

저장공간으로 공유하므로 항상 공통된 값을 갖는다.

 

class Card {
	String kind; //	인스턴스 변수 (개별 속성)
    int number;
    
    static int width = 100; // 클래스 변수 (공통 속성)
    static int height = 250;
   }

 

2. 클래스 변수 - 인스턴스 변수 앞에 static만 붙이기만 하면 된다.

인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와는 달리 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 된다.

클래스 변수는 인스턴스 변수와 달리 인스턴스를 생성하지 않고 언제라도 바로 사용할 수 있다는 특성이 있다.

'클래스이름.클래스 변수'

 

3. 지역 변수 - 메서드 내에 선언되어 메서드 내에서만 사용이 가능

메서드가 종류되면 소멸되어 사용할 수 없게 된다.

for문 while문의 블럭 내에 선언된 지역 변수는 지역변수가 선언된 블럭{} 내에서만 사용이 가능하다.

블럭을 벗어나면 소멸되어 사용할 수 없게 된다.

 

메서드

특정 작업을 수행하는 일련 문장들을 하나로 묶은 것이다.

반환타입 메서드이름 (타입 변수명, 타입 변수명, ...) ->선언부
{
//메서드 호출시 수행될 코드					->구현부
}

int add(int a, int b)
{
	int result = a + b;
    return result; //호출한 메서드로 결과를 반환한다
 }

메서드는 크게 '선언부'와 '구현부'로 이루어져 있다. 메서드를 정의한다는 것은 선언부와 구현부를 작성하는 것을 뜻한다.

 

반환타입 return type

메서드의 작업수행 결과(출력)인 '반환값'의 타입을 적는다.

반환값이 없는 경우 'void'를 적어야 한다.

 

return문

메서드의 반환타입이 'void'가 아닌 경우, 구현부{} 안에 'return 반환값;'이 반드시 포함되어 있어야 한다.

여러 개의 변수를 선언할 수 있는 매개변수와 달리 리턴문은 단 하나의 값만 반환 할 수 있다.

현재 실행중인 메서드를 종료하고 호출한 메소드로 되돌아간다.

지금까지 반환값이 있을 때만 return문을 썼지만 원래는 반환값이 유무에 관계없이 모든 메서드에는 적어도 하나의 return문이 있어야 한다. 반환타입이 void인 경우, return문 없이도 아무런 문제가 없었던 이유는 컴파일러가 메소드 마지막에 자동적으로 추가해줬음

 

호출스택

메서드의 작업에 필요한 메모리 공간을 제공한다.

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

 

1.메서드가 호출되면 수행에 필요한 만큼 메모리를 스택에 할당 받음

2.메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거 됨

3.호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.

4.아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

 

반환타입이 있는 메서드는 종료되면서 결과 값을 자신이 호출한 메서드에 반환한다. 대기상태에 있는 호출한 메서드는 넘겨받은 반환값으로 수행을 계속 진행 한다.

 

기본형 매개변수

메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.

매개변수의 타입이 기본형일 때는 기본형 값이 복사되겠지만, 참조형이면 인스턴스 주소가 복사된다.

메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻지만, 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능

 

기본형 매개변수 - 변수의 값을 읽기만 할 수 있음

참조형 매개변수- 변수의 값을 읽고 변경할 수 있다.

매개변수뿐만 아니라 반환타입도 참조형이 될 수 있다. 반환타입이 참조형이라는 것은 반환하는 값이 타입이 참조형이라는 이야기

모든 참조형 타입의 값은 '객체의 주소'이므로 그저 정수값이 반환되는 것일 뿐 특별할 것이 없다.

 

static 메서드와 인스턴스

메서드 앞에 static이 붙어 있으면 클래스 메서드이고 

붙어있지 않으면 인스턴스 메서드이다.

 

클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 '클래스이름,메서드이름(매개변수)'와 같은 식으로 호출이 가능하다.

반면 인스턴스 메서드는 반드시 객체를 생성해야만 호출이 가능하다.

 

클래스는 '데이터(변수)와 데이터에 관련된 메서드의 집합'이므로 같은 클래스 내에 있는 메서드와 멤버변수는 아주 밀접하게 관련이 있다.

인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.

그런데 인스턴스 변수는 인스턴스(객체)를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출할 수 있는 거

 반면 메서드 중에서 인스턴스와 관계없는 메서드를 클래스 메서드(static)로 정의한다.

 

그럼 static를 언제 붙어야 할까

1. 클래스를 설계할 때, 멤버 변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.

2.클래스 메서드(static메서드)는 인스턴스를 생성하지 않아도 사용할 수 없다.

3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다

4.메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면 static을 붙여준다.

작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려한다.

 

오버로딩

메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 함.

자바에서는 한 클래스 내에서 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.

한 클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것을 '메서드 오버로딩'이라고 하고 '오버로딩'이라고 한다.

그런데 모든게 오버로딩은 아니다.

1.메서드의 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3.반환 타입은 관계없다.

 

생성자

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 인스턴스변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 하는 작업을 위해서 사용 됨

-인스턴스 초기화란 인스턴스변수들을 초기화 하는 것을 뜻 함.

생성자 역시 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사함 리턴값이 없다는 점이 다르다.

1. 생성자의 이름은 클래스의 이름과 같아야 함.

2. 생성자는 리턴 값이 없다.

 

기본 생성자

모든 클래스에는 반드시 하나이상의 생성자가 정의되어 있어야 함. 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본생성자' 덕분이였음.

 

생성자에서 다른 생성자 호출하기 this()

같은 클래스의 멤버들 간에 서로 호출해야 할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.

1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.

2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

객체 자신을 가르키는 참조변수 this

생성자의 매개변수로 선언된 지역변수 값을 인스턴스변수에 저장한다. 같은 변수는 이름만으로 서로 구별되므로 아무로 문제가 없다.

그런데 매개변수로 선언된 변수의 이름이 color로 인스턴스 변수가 같을 경우에는 이름만으로 두 변수가 구별이 안 된다. 이럴 경우 사용한다.

this 인스턴스 자신을 가르키는 참조변수, 인스턴스의 주소가 저장되어 있다.

모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재함.

this(),this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용함.

 

SMALL