객체지향 프로그래밍 1

2023. 1. 23. 23:13Java Study Note

반응형

1. 객체지향언어란

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

 

※ 개체지향언어의 주요 특징:

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

2. 코드의 관리가 용이하다. 프로그램의 개발과유지보수에 드는 시간과 비용을 기획적으로 개선하였다

3. 신뢰성이 높은 프로그램을 가능하게 한다.

4. 중복된 코드를 제거한다.

2. 클래스와 객체

클래스는 '객체의 설계도 또는 틀'이라고 정의할 수 있다. 
클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다. 
객체지향이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다. 
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다. 
객체의 정의: 실제로 존재하는 것, 사물 또는 개념
객체의 용도: 객체가 가지고 잇는 기능과 속성에 따라 다름

유형의 객체: 책상, 의자, 자동차, tv와 같은 사물
무형의 객체: 수학공식, 프로그램 에러와 같은 논리나 개념

※ 객체를 사용한다는 것은 객체가 가지고 있는 속성과 기능을 사용한다는 뜻이다. 

 

1) 객체

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

클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 만들어지는 것이다. 

속성(property) 멤버변수(variable)
기능(function) 메서드(method)

 

clas Tv{
	String color; // 색깔
    boolean power; // 전원상태
    int channel; // 채널
    
    void power()  {power = !power;}// 메서드
    void channelUp() {channel++;}  // 메서드
    void channelDown() {channel--;} //메서드

2) 객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instanstiate)라고 한다.

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

 

3) 객체의 생성과 사용

클래스명 변수명;// 클래스의 객체를 참조하기 위한 참조변수를 선언, 메모리에 t를 위한 공간이 마련한다.
변수명 = new 글래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장. Tv클래스의 인스턴스가 메모리의 빈공간에 생성된다.
// 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.

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

 

class Ex6_1 { 
	public static void main(String args[]) { 
		Tv t;                 // Tv인스턴스를 참조하기 위한 변수 t를 선언       
		t = new Tv();         // Tv인스턴스를 생성한다. 
		t.channel = 7;        // Tv인스턴스의 멤버변수 channel의 값을 7로 한다. 
		t.channelDown();      // Tv인스턴스의 메서드 channelDown()을 호출한다. 
		System.out.println("현재 채널은 " + t.channel + " 입니다."); 
	} 
}

class Tv { 
	// Tv의 속성(멤버변수)   
	String color;           // 색상 
	boolean power;         	// 전원상태(on/off) 
	int channel;           	// 채널 

	// Tv의 기능(메서드) 
	void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드  
	void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드 
	void channelDown() { --channel; }   // TV의 채널을 낮추는 기능을 하는 메서드  
}
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다. 

4) 객체배열

객체배열 안에 객체가 저장되는 것은 아니고, 객체의 주소가 저장된다. 즉 객체 배열은 참조변수들을 하나로 묶은 참조변수  배열인것이다. 

Tv[] tvArr = new Tv[3]; // 길이가 3인 객체 배열 tvArr을 아래와 같이 생성한다.

동시에 각 요소는 참조변수의 기본값인 null로 자동 초기화 된다. 

3. 클래스

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

프로그래밍언어에서 제공하는 기본자료형(primitive type) 외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 '사용자정의 타입(user-defined type)' 이라고 한다.

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

멤버변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버변수 중 ststic이 붙은 것은 클래스 변수, 붙지 않은 것은 이니스턴스 변수이다. 

변수의 종류 선언위치 생성시기
클래스변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스변수 인스턴스 생성시, (인스턴스 변수 앞에 static를 붙이면 클래스변수로 됨)
지역변수 메서드 영역 변수 선언문 수행시

인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만
클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.

5. 메서드(method)란?

개념: 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 메서드는 함수, function과 같은 의미인데 객체지향언어에서는 보통 함수라는 용어대신 메서드라는 용어를 쓴다. 어떤 값을 입력받아서 처리하고 그 결과를 돌려준다.  (입력받는 값이 없을 수도 있고 결과를 돌려주지 않을 수도 있다.)

 

구성: 선언부(header), 구현부(body)

※ (타입 변수명...)은 매개변수선언(입력)

메서드의 실행 흐름

6. 호출스택(call stack)

개념: 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 메서드 수행에 필요한 메모리공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환한다. 반환타입이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드에게 반환한다. 대기상태에 있던 호출한 메서드는 넘겨받은 반환값으로 수행을 계속 진행하게 된다. 

7. 매개변수

▶ 기본형 매개변수 – 변수의 값을 읽기만 할 수 있다.(read only)
▶ 참조형 매개변수 – 변수의 값을 읽고 변경할 수 있다.(read & write)

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

 

8. static메서드와 인스턴스 메서드

일반적으로 클래스 메서드도 클래스변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능하다. 반면에 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다. 

class MyMath2 {
	long a, b;

	// 인스턴스 변수 a, b만을 잉요해서 작업하므로 매개변수가 필요없다.
	long add()		{ return a + b; }  // a, b는 인스턴스 변수
	long subtract() { return a - b; }
	long multiply() { return a * b; }
	double divide() { return a / b; }

	// 인스턴스 변수와 관계없이 매개변수만으로 작업이 가능하다.
	static long   add(long a, long b)		 { return a + b; }  // a, b는 지역변수
	static long   subtract(long a, long b)   { return a - b; }
	static long   multiply(long a, long b)   { return a * b; }
	static double divide(long a, long b) { return a / (double)b; }
	
}


class Ex6_9 {
	public static void main(String args[]) {
		// 클래스 메서드 호출. 인스턴스 생성없이 호출가능
		System.out.println(MyMath2.add(200L, 100L));
		System.out.println(MyMath2.subtract(200L, 100L));
		System.out.println(MyMath2.multiply(200L, 100L));
		System.out.println(MyMath2.divide(200L, 100L));

		MyMath2 mm = new MyMath2(); // 인스턴스를 생성
		mm.a = 200L;
		mm.b = 100L;
		// 인스턴스 메서드는 객체생성 후에만 호출이 가능함.
		System.out.println(mm.add());
		System.out.println(mm.subtract());
		System.out.println(mm.multiply());
		System.out.println(mm.divide());
   }
}

9. 오버로딩(overloading)

하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩, 간단히 오버로딩이라고 한다

오버로딩 조건

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

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

3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

  (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

10. 생성자(constructor)

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

1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다. 따라서 void를 생략할 수 있게 한다. 
클래스이름(타입 변수명, 타입 변수명, ... ) {
	// 인스턴스 생성시 수행될 코드
     // 주로 인스턴스 변수의 초기화 코드를 적는다.
}

※ 연산자 new 가 인스턴슬르 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다. 생성자는 단순히 인스턴스변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다. 

 

기본 생성자: 매개변수가 없는 생성자. 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

11. this()

생성자의 이름으로 클래스이름 대신 this를 사용한다.
한 생성자에서 다른 생성자 호출할 때는 생성자의 첫 문장에서만 가능.

생성자에서 다른 생성자 호출하기

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

12. 변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다. 

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

class InitTest{
	int x;      // iv
    int y =x;   // iv
    
    void method(){ 
    	int i;  //지역변수
        int j = i;  //에러. 지역변수를 초기화하지 않고 사용
    }
}

13. 멤버변수의 초기화

지역변수와 달리 멤버변수는 각 타입의 기본값으로 자동 초기화 된다. 

1. 클래스 변수(cv) 초기화 -> 인스턴스 변수(iv)초기화
2. 자동 초기화 -> 명시적 초기화(간단) -> 초기화 블럭, 생성자(복잡)
class Car{ //명시적 초기화(explicit initialization)
	int door = 4;            // 기본형 변수의 초기화
    Engine e = new Engine(); // 참조형 변수의 초기화
    
    //...
}

초기화 블럭(initialization blook)

클래스 초기화 블럭        클래스 변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭    인스턴스변수의 복잡한 초기화에 사용된다.
class Ex6_14 {
	static {
		System.out.println("static { }");
	}

	{
		System.out.println("{ }");
	}

	public Ex6_14() {
		System.out.println("생성자");
	}

	public static void main(String args[]) {
		System.out.println("Ex6_14 bt = new Ex6_14(); ");
		Ex6_14 bt = new Ex6_14();

		System.out.println("Ex6_14 bt2 = new Ex6_14(); ");
		Ex6_14 bt2 = new Ex6_14();
	}
}

 

반응형

'Java Study Note' 카테고리의 다른 글

2진법, 10진법, 16진법, bit  (0) 2023.02.01
연산자와 피연산자  (0) 2023.01.24
배열(Array)  (0) 2023.01.23
변수  (0) 2023.01.18
자바 시작  (0) 2023.01.18