IT Study/Java

Java - 인스턴스/클래스 변수

hhyyyjun 2022. 12. 28. 13:30

| 생성자 오버로딩, this 연습

각 주석 확인하기

1. Practice

package class01;
class Car{
	String name; //멤버변수(=속성, 필드, attribute...)
	int speed;
	int maxSpeed;
	
	void speedUp() { //멤버함수(=메서드)
		//1. 기본형 2. 기능구현 3. input,output 올바른지 체크
		this.speed+=10;
		if(this.speed>this.maxSpeed) {
			this.speed=this.maxSpeed;
			System.out.println("과속!");
		}
	}
	void speedUp(int speed) { //오버로딩
		//기본형 -> 기능구현 -> input, output 올바른지 체크
		this.speed+=speed;
		if(this.speed>this.maxSpeed) {
			this.speed=this.maxSpeed;
			System.out.println("과속!");
		}
	}
	void showInfo() {
		System.out.println(name+"님의 현재 차량 속도 : ["+this.speed+"/"+this.maxSpeed+"]");
	}
	Car(String name){
		// 1. 인자가 가장 많은 생성자만 놔두고,
		// 2. 다른 생성자에서 1번의 생성자를 재사용
		this(name,0,120);
//		this.name = name;
//		this.speed=0;
//		this.maxSpeed=120;
	}
	Car(String name, int speed, int maxSpeed){//생성자 오버로딩
		this.name = name;
		this.speed = speed;
		this.maxSpeed=maxSpeed;
	}
}
public class Test01_review {
	public static void main(String[] args) {
		Car car1 = new Car("홍길동",0,200);//기본생성자(디폴트생성자) ->생성자가 하나도 없을 때 제공
		//멤버변수가 내가 원하는 값대로 초기화되지 않음
		// ->생성자를 사용하는 이유 : 멤버변수를 원하는 값으로 초기화 가능 + 강제
		Car car2 = new Car("아리");
		
		car1.speedUp(130);
		car2.speedUp(130);
		
		car1.showInfo();
		car2.showInfo();
	}
}

2. Practice

3. Practice


| 인스턴스 변수/클래스 변수

1. 인스턴스(객체) 변수

객체마다 갖는 고유한 변수

1) 클래스 내 생성할 때 만들어지며, 각각 자신의 고유한 값을 가지고 있음

2) 각 인스턴스마다 다른 값을 가져야할 때 생성

2. 클래스 변수

모든 객체가 동일한 값을 갖는 변수

1) 모든 인스턴스가 같은 저장공간을 공유

1. Practice

num2 가 클래스 변수로써 값을 공유하므로 25번 줄에서 값을 변경한 경우 다른 객체에서도 호출했을 때 값이 공유된다.

2. Practice

3. Practice

package class01;
class Card{
	String name; //멤버 변수
	static int remaincash; //클래스 변수
	int limit;

	void use() {
		this.use(10000);
	}
	void use(int usedcash) {
		System.out.print(usedcash+"원 사용");
		if(this.limit<usedcash) {
			System.out.print(" 한도초과!");
		}
		else if(remaincash-usedcash<0) {
			System.out.print(" 잔액부족!");
		}
		else {
			remaincash-=usedcash;
		}
		System.out.println(" 남은 금액 "+remaincash+"원");
	}
	//모듈화 : 동일한 기능을 하나의 함수로 묶는 것
	void showInfo() {
		System.out.println(this.name+"님 [남은금액 : "+this.remaincash+"원]");
	}
	Card(String name){
		this(name, 200000);
	}
	Card(String name, int limit){
		this.name = name;
		this.limit = limit;
	}
}
public class Test07_exam {

	public static void main(String[] args) {
		//홍길동 최초 20만원 보유
		Card card1 = new Card("홍길동");
		Card card2 = new Card("홍길동", 20000);//한도
		
		card1.remaincash=200000; //Card. 로 쓰는 것이 더 좋음
		
		card1.use();      //카드를 한 번 쓰면 10000원 사용한다면> 190000원
		card1.use(100000);//100000원 사용 : 남은 금액 90000원
		card2.use(50000); //50000원 사용 : 한도초과! 남은 금액 90000원
		card2.use();      //10000원 사용 : 남은 금액 80000원
		card1.use(90000); //90000원 사용 : 잔액부족! 남은 금액 80000원

		card1.showInfo(); //홍길동님[남은 금액 : 80000원]
		card2.showInfo();
	}
}


| 객체 배열

같은 클래스로 만들어진 여러 변수들의 나열된 집합. 같은 구조를 갖고 있으나 다른 객체 값을 저장

객체를 만들어도 각 인덱스 값을 선언해줘야 사용할 수 있다.

1. Practice

2. Practice - 학생부 프로그램

package class02;

import java.util.Scanner;
class Student{
	String name; //멤버 변수
	int score;
	void showInfo() { //멤버 함수
		System.out.println(name+"학생은 "+score+"점 입니다.");
	}
	Student(String name, int score){ //매개변수 생성자
		this.name = name;
		this.score = score;
		System.out.println(this.name+"학생 입력 완료!");
	}
}
//학생부 프로그램 CRUD 로직
public class Test09 {

	public static void main(String[] args) {
		Student[] data = new Student[3];
		int index = 0; //data에 몇개까지 들어있는지 알려줄 변수

		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("1. 추가");
			System.out.println("2. 출력");
			System.out.println("3. 변경");
			System.out.println("4. 종료");
			System.out.print("입력 : ");
			int act = sc.nextInt();
			//유효성 검사 > 사용자가 입력하는 경우라면 무조건

			if(act==1) {
				if(index == data.length) {// index가 배열 길이와 같다면
					System.out.println("데이터 공간이 부족!");
					continue;//while문 최상단으로 이동
				}
				System.out.print("이름 입력 : ");
				String name = sc.next();
				//성적에 대한 유효성 검사
				System.out.print("성적 입력 : ");
				int score = sc.nextInt();

				data[index] = new Student(name, score); //객체 생성
				index++;
			}
			else if(act==2) {
				if(index == 0) {
					System.out.println("저장된 정보가 없습니다.");
					continue;
				}
				else {
					System.out.println("학생목록");
					for(int i=0;i<index;i++) {
						data[i].showInfo();
					}
				}
			}
			else if(act==3) {
				System.out.print("정보를 변경할 학생의 번호 입력 : ");
				int num = sc.nextInt();
				num--;
				if(num <0 || num >=index) {
					System.out.println("없는 번호 입니다 확인 후 다시 이용 해주세요");
					continue;
				}
				System.out.print("변경할 점수 입력 : ");
				data[num].score=0;
				System.out.println(data[num].name+"학생 정보 변경 완료!");
			}
			else if(act==4) {
				System.out.println("종료"); //정말 종료하시겠습니까?
				break;
			}
			else {
				System.out.println("잘못된 입력입니다.");
			}
		}
	}
}