Chapter06 객체지향 프로그래밍 I(Object-oriented Programming I)

cookienc·2021년 6월 27일
0

Java 기본 개념

목록 보기
5/13
post-thumbnail

1. 객체지향언어

1.1 객체지향언어

기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태

주요 특징
1. 코드의 재상용성이 높다.
2. 코드의 관리가 용이하다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.

2. 클래스와 객체

2.1 클래스와 객체의 정의와 용도

클래스의 정의 : 객체를 정의해 놓은 것을 의미
클래스의 용도 : 객체를 생성하는데 사용

객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, 자동차 등과 같은 사물
무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념

2.2 객체와 인스턴스

인스턴스화 : 클래스로부터 객체를 만드는 과정
인스턴스 : 클래스로부터 만들어진 객체
인스턴스와 객체는 같은 의미이다.

2.3 객체의 구성요소 - 속성과 기능

속성 : 멤버변수, 특성, 필드, 상태
기능 : 메서드, 함수, 행위

2.4 인스턴스의 생성과 사용

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

Tv t;		//Tv클래스 타입의 참조변수 t 선언
t = new Tv();   // Tv인스턴스를 생성한 후, 생선된 Tv인스턴스의 주소를 t에 저장 

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.

2.5 객체 배열

객체 배열안에 객체의 주소가 저장된다.(참조변수 배열)

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(), }; // 위의 예제와 동일
Tv[] tvArr = new Tv[100];

for(int i=0; i<tvArr.length; i++) {
	tvArr[i] = new Tv();
} // 양이 많은 배열을 초기화 할 때

2.6 클래스의 또 다른 정의

  1. 변수 : 하나의 데이터를 저장할 수 있는 공간
  2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
  3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
  4. 클래스 : 데이터와 함수의 결합(구조체 + 함수)


3. 변수와 메서드

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

class Variables
{
 	int iv;		// 인스턴스 변수
    	static int cv;	// 클래스 변수(static변수, 공유변수)
        
        void method()
        {
        	int lv = 0;	// 지역변수
        }
}
변수의 종류선언위치생성시기
클래스변수(class variable)클래스 영역클래스가 메모리에 올라갈 때
인스턴스변수(instance variable)클래스 영역인스턴스가 생성되었을 때
지역변수(local variable)클래스 영역 이외의 영역(메서드, 생성자, 초기화 블럭 내부)변수 선언문이 수행되었을 때

3.2 클래스변수와 인스턴스변수

class Card {
	String kind; // 무늬
    	int number;  // 숫자 //인스턴스변수
        
        static int width  = 100; // 폭
        static int height = 250; // 높이
 // 클래스 변수
 }

인스턴스변수는 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 항상 공통된 값을 가진다.

3.3 메서드

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

<메서드를 사용하는 이유>
1. 높은 재상용성(reusability)
2. 중복된 코드의 제거
3. 프로그램의 구조화

3.4 메서드의 선언과 구현

int add(int a, int b)	// 선언부(반환타입 : int, 메서드 이름 : add, 매개변수 선언 : int a, int b
{
	int result = a+ b;
    	return result; // result를 반환
}	// 구현부

3.5 메서드의 호출

메서드이름(1,2, ...); // 메서드 호출 방법

3.6 return문

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

3.7 JVM의 메모리 구조

  1. 메서드 영역(method area) : 프로그램 실행 중에 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)를 읽어서 분석하여 클래스에 대한 데이터를 이곳에 저장한다. 이 때, 그 클래스이 클래스 변수도 이 영역에 생성된다.
  2. 힙(heap) : 인스턴스가 생성되는 공간. 즉, 인스턴스변수들이 생성되는 공간이다.
  3. 호출스택(call stack or execution stack) : 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용되고, 작업을 마치면 메모리공간은 비워진다.

<호출스택의 특징>

  • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
  • 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
  • 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
  • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

3.8 기본형 매개변수와 참조형 매개변수

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.(값이 복사가 된다.)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.(주소를 알 수 있다.)

3.9 참조형 반환타입

메서드가 '객체의 주소'를 반환한다는 것을 의미'

3.10 재귀호출(recursive call)

void method() {
	method(); // 재귀호출. 메서드 자기 자신을 호출한다.
}
  • 재귀호출문을 반복문으로도 만들 수가 있는데, 재귀호출의 수행시간이 반복문보다 더 오래 걸린다. but 재귀호출문이 훨씬 간결하게 표현된다.(ex 팩토리얼)

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

클래스 메서드 : 인스턴스와 관계없는 메서드
인스턴스 메서드 : 인스턴스와 관련된 작업을 하는)(인스턴스 변수를 필요로 하는) 메서드

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

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

같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다. 단, 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경웨는 인스턴스를 생성해야 한다.



4. 오버로딩(overloading)

4.1 오버로딩이란?

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

4.2 오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.(반환 타입은 영향을 주지 않는다.)

4.3 오버로딩의 장점

같은 기능을 하는 메서드를 하나의 이름으로 정의 할 수 있다.

4.4 가변인자(varargs)와 오버로딩

가변인자는 내부적으로 배열을 이용한다.

String concatenate(String s1, String... str) {...} // 가변인자는 항상 마지막에 위치해야 한다.
// 가변인자는 인자가 아예 없을 수도 있다.


5. 생성자(Constructor)

5.1 생성자란?

인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

Card c = new Card(); // Card()는 생성자이다.

<생성자의 특징>
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.
3. 오버로딩이 가능하다.

class Card {
	Card()	{	// 매개변수가 없는 생성자
    		...
   	}
    
    	Card(String K,int num) {	// 매개변수가 있는 생성자
        	...
        }
}

5.2 기본 생성자(default constructor)

클래스에 생성자를 정의하지 않아도 인스턴스를 생성할 수 있었던 이유는 기본 생성자 덕분이다.(클래스에 정의된 생성자가 하나도 없을 때)

클래스이름() { }

5.3 매개변수가 있는 생성자

인스턴스를 생성하는 것과 동시에 원하는 값으로 초기화가 가능하다.

class Car {
	String color; // 색상
    	String gearType; // 변속기 종류
        int door; // 문의 개수
        
        Car() {}	// 생성자
        Car(String c, String g, int d) { // 매개변수가 있는 생성자
        	color = c;
            gearType = g;
            door = d;
        }
}

Car c = new Car("white", "auto", 4);

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

this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 상요한다.

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
  • 생성자 내에서 다른 생성자를 호출할 때, this를 사용한다.
  • static메서드에서는 사용이 불가하다.

5.5 생성자를 이용한 인스턴스의 복사

  Car(Car c){
    	color = c.color;
    	gearType = c.gearType;
    	door = c.door;
    }


6. 변수의 초기화

6.1 변수의 초기화

멤버변수는 초기화를 하지 않아도 자동적으로 기본값으로 초기화가 이루어 지지만, 지역변수는 사용하기 전에 반드시 초기화해야하 한다.

<멤버변수의 초기화 방법>
1. 명시적 초기화(explicit initialization)
2. 생성자(constructor)
3. 초기화 블럭(initialization block)

6.2 명시적 초기화(explicit initialization)

변수를 선언과 동시에 초기화하는 것

6.3 초기화 블럭(initialization block)

  • 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용한다. 클래스가 메모리에 처음 로딩될 때 한번만 수행
  • 인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용한다. 인스턴스를 생성할 때 마다 수행
class InitBlock {
	static { /*클래스 초기화블럭 */ }
    
    { /*인스턴스 초기화블럭*/}
    
    //...
}

=>코드의 중복을 제거하고 신뢰성을 높인다.

6.4 멤버변수의 초기화 시기와 순서

  • 클래스변수의 초기화 시점 : 클래스가 처음 로딩될 때 한번 초기화
  • 인스턴스변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화
  • 클래스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
  • 인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자

0개의 댓글