코드 그라데이션

Day15. 클래스 도입 본문

Java/Mega

Day15. 클래스 도입

완벽한 장면 2023. 4. 5. 01:54

클래스

도입 전, 한 가지 알고 가야할 것

자바는 객체지향언 입니다.(O)

자바는 클래스지향언어 입니다.(X)

등장배경

1. 개수 제한 => 배열은 크기가 한 번 정해지면 변동이 불가능

2. 똑같은 자료형만 사용가능(특히 배열)하므로, 여러 정보를 한 번에 가져다가 저장하기가 어렵다.

 

이걸 보완하기 위해 먼저 등장한 개념 "구조체"

 

구조체 =>여러 자료형 변수를 하나의 변수로 관리하는 매커니즘.

 

그런데, 구조체 역시 한계가 왔다.

그래서 구조체에 함수(메서드) 개념을 더하여 => 클래스가 등장했다.

 

클래스란...

클래스

속성(데이터) + 기능(메소드) 의 집합

 

예시) 개(dog)

-> 이름(String), (int), 나이(int) // 짖는다, 움직인다, 꼬리를 흔든다.

                       속성 (필드)                              기능(메서드)

 

 

클래스를 정의하면서 또 절대 빠질 수 없는 개념이 바로 객체

객체(Object)

: 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신과 다른 것을 식별가능한 것

앞서 봤듯이 객체는  

속성 (필드)   /     기능(메서드)

으로 구성됨.

 

객체 생성 방법

new + 클래스명();

         (디폴트생성자) <= 선언하지 않으면 자바 컴파일러가 자동으로 추가시킴.

 

예시

class A{

   //속성
   int a;
   String str;
   //기능
   void print(){
        System.out.println(“a는“ + a + “입니다.”);
   }

}

이 때...

A a1 = new A();
변수      객체
a1.a = 10; // a에 10이 담김
a1.print(); // 10 출력

A a2 = new A();
a2.a = 20; // a에 20이 담김
a2.print(); // 20 출력

a1과 a2는 다르다(독립적)

이렇게 된다.

 

객체가 생성된 모양

 

클래스 예시 

package Day15;
class A{
	int a;
	void print() {
		System.out.println("a는 "+a+"입니다.");
	}
}

public class ClassTest1 {

	public static void main(String[] args) {
		
		A a1 = new A();
		a1.a = 10;
		a1.print();
        
		A a2 = new A();
		a2.a = 20;
		a2.print();
		
        
		A a3 = a1; // 얕은복사
		a3.print(); 
        
		a3.a = 30;
		a1.print();
        
        만약에
//      A a4 = null;
//		a4.a = 10;
	}

}

 

실행 결과

지금 여기서 유심히 봐야 할 것.

A a3 = a1

a3.print() // 10이 나오긴 한다.

 

그런데...

a3는 한번도 new를 불러준 적이 없다.

그럼 a3은 a1과 똑같은 것을 바라보게 되는 것.

그래서 10이 나온다.

(이게 바로 call by Reference)

 

주석처리한 코드를 넣고, 이걸 출력하면, NullPointException 나옴.

 

수업시간 예제

package Day15;

class Pencil{
	String color;
	void print() {
		System.out.println("쓰는 기능은 "+ color + "연필로 적습니다.");
	}
}

class Eraser{
	String menu;
	void erase() {
		System.out.println("지우개인 "+menu+"제품으로 지웁니다.");
	}
}

class Pen{
	String[] info = new String[2];
	void write() {
		System.out.println("펜을 "+info[0]+"제품의 "+info[1]+"으로 씁니다.");
	}
}


public class Q3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Pencil pc1 = new Pencil();
		pc1.color = "빨간";
		Pencil pc2 = new Pencil();
		pc2.color = "파란";
		Pencil pc3 = new Pencil();
		pc3.color = "주황";
		Pencil pc4 = new Pencil();
		pc4.color = "노랑";
		pc1.print();
		pc2.print();
		pc3.print();
		pc4.print();
		
		Eraser e1 = new Eraser();
		Eraser e2 = new Eraser();
		
		e1.menu = "잠자리";
		e2.menu = "모닝글로리";
		
		e1.erase();
		e2.erase();
		
		Pen p1 = new Pen();
		Pen p2 = new Pen();
		Pen p3 = new Pen();
		
		p1.info[0] = "모나미";
		p1.info[1] = "검정색";
		p2.info[0] = "제트스트림";
		p2.info[1] = "초록색";
		p3.info[0] = "워터맨";
		p3.info[1] = "베이비블루";
		
		p1.write();
		p2.write();
		p3.write();
		
	}

}

 

실행결과

쓰는 기능은 빨간연필로 적습니다.
쓰는 기능은 파란연필로 적습니다.
쓰는 기능은 주황연필로 적습니다.
쓰는 기능은 노랑연필로 적습니다.
지우개인 잠자리제품으로 지웁니다.
지우개인 모닝글로리제품으로 지웁니다.
펜을 모나미제품의 검정색으로 씁니다.
펜을 제트스트림제품의 초록색으로 씁니다.
펜을 워터맨제품의 베이비블루으로 씁니다.
728x90

'Java > Mega' 카테고리의 다른 글

Day16 (2). 생성자(2), HAS 관계  (0) 2023.04.05
Day16 (1). 생성자  (0) 2023.04.05
Day14. 재귀함수의 개념  (0) 2023.04.05
Day14. 별찍기+구구단 메서드화  (0) 2023.04.02
메서드화 연습하기  (0) 2023.04.02
Comments