Flaming Soccer ball
JAVA

12일차 22.10.06

leo lee 2022. 10. 6.
반응형
package quiz02;

public class Person {
	int age;
	String name;
	
	
	//프로그래머가 생성자를 인위적으로 생성하면, 기본 생성자를 자동 생성 하지 않는다. 
	//생성자를 만들면 꼭 기본 생성자도 만들어줘야한다.
	//name, age를 매개 변수로 받는 생성자(초기화)
	
	Person(){	
	}
	
	Person(int ageI, String nameI) {
		age = ageI;
		name = nameI;
	}
	
	String info() {
		
		String ans ="나이:" + age + " 이름:" + name;
		
		return ans;
	}
}
package quiz02;

public class Coffee {

	String menu;
	int price;
	int count;
	int sum;
	boolean bool;
	
	Coffee(){
		System.out.println(bool);
	}
	
	Coffee(String m, int p, int c){
		menu = m;
		price = p;
		count = c;
	}
	
	void count() {
		System.out.println(menu + "를 " + count + "잔 구매함");
	}
	
	int priceSum() {
		
		sum = price * count;
		
		return sum;
	}
	
	
}
package quiz02;

public class MainClass {
	
	public static void main(String[] args) {
		/*
		 * Person클래스를 파일로 정의
		 * 
		 * 멤버변수는 int age, String name
		 * 메서드 info() : String - 멤버변수를 문자열로 더해서 반환 
		 * 
		 * 메인에서는 Person 객체를 2개 생성해서 각각 확인
		 */
		
		Person per1 = new Person();
		per1.age =  1;
		per1.name = "사람1";
		System.out.println(per1.info());
		
		Person per2 = new Person();
		per2.age =  2;
		per2.name = "사람2";
		System.out.println(per2.info());
	
		Person per3 = new Person(3, "사람3");
		System.out.println(per3.info());
		
		///////////////////////////////
		//멤버변수, 메서드 , 생성자를 사용해서
		//현실에 찾아볼 수 있는 물건 생각해서 표현
		//생성해서 사용
		System.out.println();
		Coffee cof = new Coffee();
		Coffee cof1 = new Coffee("카페 라떼" , 4000, 5);
		Coffee cof2 = new Coffee("아이스 아메리카노" , 3000, 3);
		Coffee cof3 = new Coffee("아이스 초코" , 4500, 2);
		cof1.count();
		System.out.println(cof1.priceSum() + "원 입니다");
		cof2.count();
		System.out.println(cof2.priceSum() + "원 입니다");
		cof3.count();
		System.out.println(cof3.priceSum() + "원 입니다");
		
		System.out.println("총 가격은 " + add(cof3.sum, add(cof1.sum, cof2.sum))
		+ "원 입니다");
		
		
		
		
	}
	static int total = 0;
	static int add(int a , int b) {
		
		total = a + b;
		
		return total;
	}

}

프로그래머가 생성자를 인위적으로 생성하면, 기본 생성자를 자동 생성 하지 않는다. 
생성자를 만들면 꼭 기본 생성자도 만들어줘야한다.

예를 들어 Person(String n, String n1){ }을 만들었는데 Person() { }을 만들지 않는다면

Person p = new Person();을 생성 할 수 없다. 무조건 매개 변수가 들어가게만 객체를 형성 할 수 있음.

 

package pac.def;

import pac.abc.Apple;//패키지 명을 포함한 클래스 명
import pac.abc.Banana;

import java.util.Scanner;
public class MainClass {

	public static void main(String[] args) {

		Melon m = new Melon();
		Apple a = new Apple();
		Banana b = new Banana();
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println(m); //주소 값
		System.out.println(new int[3]);
		
		String str1 = "hello";
		String str2 = "hello";
		String[] str3 = {"hello"};
		System.out.println(str1 == str3[0]);
	}

}

package는 개발자가 직접 만드는 사용자 정의 클래스,  혹은 JDK(Java Development Kit) 안에 포함되어 있거나, 다른 개발자들이 미리 만들어 놓은 클래스가 있다. 

클래스는 매우 종류가 다양하고 비슷한 기능들을 분류시켜야 할 필요성이 있기 때문에 서로 관계가 있는 것들 끼리 패키지로 묶어서 관리한다.

pacakge는 가장 위에 선언이 되어야 하며, 위 같은 경우에는 다른 package의 클래스를 사용하고 싶을 때 import 키워드로 클래스의 전체 경로(패키지 명까지 포함)를 지정해줘야 한다. 패키지 안에 모든 클래스를 사용하고 싶다면 *기호를 넣어주면 된다.

 

기본 타입(primitive type)  vs 참조 타입(reference type)

기본 타입은 정수, 실수, 문자, 논리 값을 저장하는 데이터 타입

기본으로 선언된 변수는 실제 값(value)을 변수에 저장

참조 타입은 객체의 주소를 참조하는 타입으로 배열, 클래스, 인터페이스 타입

참조로 선언된 변수는 메모리의 주소 값을 변수 안에 저장

쉽게 말해서 참조 타입은 스택 영역에는 주소 값을 저장하고, 실제 값은 힙이라는 영역(주소값)에 저장하기 때문에 스택 영역에 저장된 주소 값의 주소에 실제 값이 저장된다라고 보면 된다. 

 

 

package str_ex;

public class StrEquals {

	public static void main(String[] args) {
		
		String str1 = "홍길자";
		String str2 = "홍길자";
		
		String str3 = new String("홍길자");
		String str4 = new String("홍길자");
		System.out.println(str1);
		System.out.println(str2);
		System.out.println(str3);		
		System.out.println(str4);		
		
		System.out.println(str1 == str2); // 같음
		System.out.println(str1 == str3); // 다름
		System.out.println(str1 == str4); // 다름
		System.out.println(str3 == str4); // 다름
		
		
		System.out.println(str1.equals(str3)); // 같음
		System.out.println(str3.equals(str4)); // 같음
		
		/*
		 * 같은 클래스 내부에서 문자열을 선언하면 동일한 위치를 참조한다.(동일한 문자일 경우)
		 * 하지만, 다른 클래스에서 넘어오는 String은 다른 위치를 가지게 된다.
		 * 
		 * 그래서 문자열 비교시에는 == 대신에 String 클래스가 제공해주는 equals()를 사용합니다.
		 */
	}
	
}

따라서 실제 String 같은 경우에 String str1 = "Hello"; 와 String str1 = "Hello";는 같은 위치에 형성되기 때문에 ==자로 비교하면 같다고 나오지만 실제 String str3 = new String("Hello");로 만든다면 다른 위치에 "Hello" 값이 형성 되기 때문에 ==으로 비교하면 다르다고 나온다.

따라서, String 같은 경우에는 String.equals(); 라는 메소드로 값을 비교해줘야 정확하게 비교를 한다.

 

실제 위의 경우는 모든 변수를 공유하는데 각각의 클래스에 변수를 사용했기 때문에 비효율 적이다.

따라서 효율적으로 사용하기 위해서는 상속이라는 기능을 사용 할 수 있는데, 그 경우가 아래와 같다.

 

package day12.inherit.good;

public class MainClass {

	public static void main(String[] args) {

		Person p = new Person();
		p.age = 10;
		p.name = "부모님";
		System.out.println(p.info());
		
		Student s = new Student();
		s.age = 20;
		s.name  = "홍길자";
		s.studentId = "123123";
		System.out.println(s.info());
		
		Teacher t = new Teacher();
		t.age = 30;
		t.name  = "이순신";
		t.subject = "역사";
		System.out.println(t.info());
	
		Employee e = new Employee();
		e.age = 35;
		e.name  = "ㅇㅈㅇㅈ";
		e.department = "ㅇㅈ";
		System.out.println(e.info());
		
	
	
	}

}

 

이런식으로 부모 클래스를 하나 형성하여 공유하는 변수들을 넣고, extends를 사용하여 나머지 자식 클래스들은 부모 클래스에 있는 모든 변수, 함수를 사용 할 수 있다. 실제 Person이라는 클래스에만 이름과 나이의 변수와 info() 함수를 넣었지만, Teacher, Student, Employee가 Person을 extends하여 그 변수들과 info() 함수를 사용 할 수 있도록 하였다.

 

package quiz03;

public class MainClass {

	public static void main(String[] args) {
		
		//Dmb폰 객체 생성
		DmbPhone dp = new DmbPhone("햅틱", "메탈그레이", 10);

		//Phone클래스에서 상속받은 멤버 변수에 접근
		System.out.println("모델: " + dp.model);
		System.out.println("색상: " + dp.color);
		//DmbPhone에서 선언한 멤버 변수에 접근
		System.out.println("채널: " + dp.channel);

		//Phone에서 상속받은 메서드 호출
		dp.powerOn();
		dp.ring();
		dp.sendVoice("여보세요??");
		dp.recieveVoice("안녕하세요? XX보험입니다.");
		dp.hangUp();

		//DmbPhone에서 선언한 메서드 호출
		dp.turnOnDmb(); //기능: TV를 켭니다 출력
		dp.changeChannel(7); //기능: channel변수를 전달받은 변수로 변경후 출력
		dp.turnOffDmb(); //기능: TV를 끕니다 출력
		dp.powerOff();


	}

}

 

예시로 quiz를 풀었는데 DmbPhone이 Phone을 상속 받아 Phone의 변수 및 함수들을 사용 할 수 있도록 해주었다.

이 결과로 메인에서 DmbPhone에 대한 객체만 만들어 주었음에도 불구하고 모든 값을 출력 할 수 있다.

 

Wizzard와 Warrior라는 클래스를 만들어 Player 클래스의 상속을 받아 이름만 매개 변수로 받고 체력과 마나는 고정으로 한다. 마나 감소를 하는 스킬 함수를 만들어서 사용하면 마나가 감소하게 하고 출력한다.

 

오늘은 클래스를 활용하여 생성자 및 메서드를 다시 다뤄 보았고, 일반적으로 생성자는 임의로 매개변수를 넣어 프로그래머가 만들어 주었을 때 매개변수가 없는 생성자도 꼭 생성을 해줘야만 매개변수를 넣지 않아도 생성이 가능해진다.

기본 타입이 아닌 참조 타입의 변수들은 생성해서 값을 넣어 줄 때 그 값이 주소값으로 저장이 되기 때문에 동등한 비교를 하기 위해서 특히 String은 equals();를 써줘야 한다.

만약 여러 개의 클래스를 사용하는데 사용하는 변수 혹은 함수가 겹치는 경우가 생길 때 하나의 부모 클래스를 만들어서 상속을 받게 할 수 있다. 예를 들어 학교에는 학생, 선생, 직원이 있다면 각각 이름 과 나이는 공통으로 가지며 정보를 출력하는 함수도 공통으로 가질 수 있다. 그런 경우에는 사람이라는 부모클래스를 만들어서 이름, 나이, 정보 출력 함수를 생성하여 상속하면 공통으로 사용 할 수 있는 권한을 가진다.

분명 예전에 상속이라는 개념을 배웠을 때는 정말 혼란 스러웠지만, 지금은 조금 덜 한 것 같다. 지금도 사실상 완벽하게 이해라기 보다는 사용하는데 조금 더 편리해져 있다는 표현이 맞을 거 같다. 아직 까지도 혼동이 되는 부분들이 있기 때문에 나중에 더 심화가 되었을 때 헷갈리지 않기 위해서는 이번에 개념을 확실하게 잡고 넘어가는 것이 좋겠다. 오늘은 이만 종료

반응형

'JAVA' 카테고리의 다른 글

14일차 22.10.11  (0) 2022.10.11
13일차 22.10.07  (0) 2022.10.07
11일차 22.10.05  (0) 2022.10.05
10일차 22.10.04  (0) 2022.10.04
9일차 22.09.30  (0) 2022.09.30

댓글