객체지향 언어

80년 초 소프트웨어의 위기 빠른 변화를 못 쫓아감

해결책으로 객체지향 언어를 도입 (절차적->객체지향)

코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거

객체지향 언어(object-oriented programming) = 프로그래밍 언어 + 객체지향개념(규칙)

 

- 핵심개념

1. 캡슐화

2. 상속

3. 추상화

4. 다형성

 

클래스와 객체

클래스란, 객체를 정의해 놓은 것.

클래스는 객체를 생성하는데 사용한다.

 

객체란, 실제로 존재하는 것. 사물 또는 개념.

객체의 용도는 객체가 가지고 있는 기능과 속성에 따라 다르다.

 

클래스-객체 <-> 제품설계도-제품

 

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

객체 = 속성(변수) + 기능(메서드)

 

속성 크기, 길이, 높이, 색상, 볼륨, 채널 등

기능 켜기, 끄기, 볼륨 높이기, 채널 변경하기 등

 

객체와 인스턴스

객체 모든 인스턴스를 대표하는 일반적 용어

인스턴스 특정 클래스로부터 생성된 객체

 

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

 

하나의 소스파일에 여러 클래스 작성

public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.

public class가 하나도 없는 경우, 소스파일의 이름은 어떤 클래스나 가능.

 

객체의 생성과 사용

- 객체의 생성  

class Tv {
	String color;
	boolean power;
	int channel;

	void power()		{ power = !power; }
	void channelUp()	{ channel++; }
	void channelDown()	{ channel--; }
	}
Tv t; // Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

 

- 객체의 사용

t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
t.channelDown(); // Tv인스턴스의 메소드 channelDown()을 호출한다.

 

클래스 작성(설계도) -> 객체 생성(제품) -> 객체 사용(제품 사용)

 

ex)

class Tv {
	String color;
	boolean power;
	int channel;
	
	void power() {
		power = !power;
	}
	void channelUp() {
		++channel;
	}
	void channelDown() {
		--channel;
	}
}

public class Ex6_1 {

	public static void main(String[] args) {
		Tv t;
		t = new Tv();
		t.channel = 7;
		t.channelDown();
		System.out.println("현재 채널은 " + t.channel + " 입니다.");

	}

}

 

ex) 참조변수의 영향

public class Ex6_2 {

	public static void main(String[] args) {
		Tv t1 = new Tv();
		Tv t2 = new Tv();
		System.out.println("t1의 channel 값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel 값은 " + t2.channel + "입니다.");

		t1.channel = 7;
		System.out.println("t1의 channel 값을 7로 변경하였습니다.");
		
		t2 = t1;
		System.out.println("t1의 channel 값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel 값은 " + t2.channel + "입니다.");
	}

}

객체 배열

객체 배열 == 참조변수 배열

 

class Tv {
	String color;
	boolean power;
	int channel = 9;
	
	void power() {
		power = !power;
	}
	void channelUp() {
		++channel;
	}
	void channelDown() {
		--channel;
	}
}
public class Practice {

	public static void main(String[] args) {
		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() }; 로 한번에 작성 가능
        
        }
        
}

 

클래스의 정의

클래스 1) 설계도 2) 데이터+함수 3) 사용자 정의 타입 / 3가지로 정의할 수 있다.

 

사용자 정의 타입 원하는 타입을 직접 만들 수 있다.

 

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

클래스 영역 인스턴스 변수(instance variable)

- 클래스 변수(class variable, static+iv)

 

클래스 영역은 선언문만 존재 가능, 선언문의 순서는 상관 없음.

 

메소드 영역 지역 변수(local variable)

class Variables {

	int iv; // 인스턴스 변수
	static int cv; // 클래스 변수(static 변수, 공유 변수)

	void method() {
		int lv = 0; // 지역변수
	}

}

(객체는 iv의 묶음이다... 라고 일단 생각하자)

 

 

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

인스턴스 변수(개별 속성), 클래스 변수(공통 속성)

 

class Card {

	String kind; // 무늬
	int number; // 숫자

	static int width = 100; // 폭
	static int height = 250; // 높이

}
public class Practice2 {

	public static void main(String[] args) {

		Card c = new Card();
		c.kind = “HEART”;
		c.number = 5;
		c.width = 200; 		// -> Card.width = 200;
		c.height == 300;	// -> Card.height = 300;	이렇게 쓰는게 바람직하다.
        
	}
    
}

 

 

ex)

public class Ex6_3 {

	public static void main(String[] args) {
		System.out.println("Card.width = " + Card.width);
		System.out.println("Card.height = " + Card.height);
		
		Card c1 = new Card();
		c1.kind = "Heart";
		c1.number = 7;
		
		Card c2 = new Card();
		c2.kind = "Heart";
		c2.number = 4;
		
		System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + Card.width + ", " + Card.height + ")");
		System.out.println("c2는 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + Card.width + ", " + Card.height + ")");
		
		System.out.println("c1의 width와 height를 각각 50, 80으로 변경합니다.");
		Card.width = 50;
		Card.height = 80;
		
		System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + Card.width + ", " + Card.height + ")");
		System.out.println("c2는 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + Card.width + ", " + Card.height + ")");
		
	
	}

}

class Card {
	
	static int width = 100;
	static int height = 250;
	String kind;
	int number;
	
}

출처 : 남궁성의 정석코딩 유튜브

 

+ Recent posts