Java - getter/setter, static 복습(1)

wlsdnboy·2022년 2월 23일
0

오늘은 getter/setter에 대해 좀 더 알아보고 스태틱에 대해서 공부해보겠습니다.

getter/setter

  • 학생이 대중교통을 이용하는 예제 코드
//Bus.java


public class Bus {
	String num;
	int money;
	int count;
	public String getNum() {
		return num;
	}
	public void setNum(String num) {
		this.num = num;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money += money;  //setMoney(1000)을 하면 money += 1000이 된다
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count += count;  //setCount(1)을 하면 count +=1이 된다
	}
	
}


//Subway.java


public class Subway {
	String name;
	int money;
	int count;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money += money; //setMoney(1000)을 하면 money += 1000이 된다
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count += count; //setCount(1)을 하면 count +=1이 된다
	}
	
	
}


//Student.java


public class Student {
	String name; // 학생의 이름 변수
	int money; // 학생의 가진돈의 변수
	Bus b; // 학생이 어떤 버스를 이용하는지 정보등록을 위해 선언 
    // 여기서 버스 객체를 생성하면 버스 번호는 같아도 다른 버스가 된다
    // 버스를 타는 학생은 버스 정보를 알고있어야 하기 때문에 선언한다
	Subway s;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	
	public void run(Object o) { //Object 객체의 시조. 모든 파생 객체를 담을 수 있다
		if (o instanceof Bus) { // instanceof 받아온 매개변수가 버스 타입인지 확인한다.
			this.money -= 1000; // 학생의 돈이 1000원 차감된다
			
			this.b = (Bus) o; // 명시적 형변환 
            // 들어온 객체가 가지고 있는 학생 정보를 타고가는 버스 객체에게 전달한다
			b.setCount(1); // 버스 count에 1을 추가한다
			b.setMoney(1000);// 버스 돈에 1000을 추가한다
			
		}
		else if(o instanceof Subway) { // 받아온 매개변수가 서브웨이인지 확인한다
			this.money -= 1000;  // 학생의 돈이 1000원 차감된다.
			
			this.s = (Subway)o; // 받아온 매개변수 타입의 정보를 서브웨이로 전달한다
			s.setMoney(1000); // 지하철 money에 1000을 추가한다
			s.setCount(1); //지하철 count에 1을 추가한다.
			
		}
		
		
		
	}
	
	
}

//main.java

public class Main {

	public static void main(String[] args) {

	Student s1 = new Student(); //학생의 객체를 생성하고
	s1.setName("hi"); //학생의 이름을 추가하고
	s1.setMoney(10000); // 학생의 돈을 추가한다.
	
	Bus b1 = new Bus(); // 버스의 객체를 생성하고
	b1.setNum("a"); // 버스의 이름을 추가한다.
	
	
	s1.run(b1); // 학생 클래스에 메소드를 실행하고 버스 객체를 전달한다
	
	System.out.println(s1.getName() + "는 " + b1.getNum() + "버스를 탔습니다"); // 학생의 이름과 버스의 이름을 가지고 온다
	System.out.println("요금을 1000원 지불하여 " + s1.getName() + "의 잔액은 " + s1.getMoney() +" 입니다"); // 학생의 이름과 잔액을 가지고 온다
	System.out.println(b1.getNum() + "은 잔액 " + b1.getMoney() +"이고 사람은" + b1.getCount() + " 입니다" );  // 버스의 이름과 잔액, 사람수를 가지고 온다
	
	Subway sw1 = new Subway(); // 서브웨이 객체를 생성하고
	sw1.setName("z"); //서브웨이의 이름을 설정한다
	
	s1.run(sw1); // 학생 클래스의 run메소드를 실행하고 서브웨이 객체를 전달한다
	System.out.println(s1.getName() + "는 " + sw1.getName() + "지하철을 탔습니다"); // 학생의 이름과 지하철의 이름을 가지고 온다
	System.out.println("요금을 1000원 지불하여 " + s1.getName() + "의 잔액은 " + s1.getMoney() +" 입니다"); // 학생의 이름과 잔액을 가지고 온다
	System.out.println(sw1.getName() + "은 잔액 " + sw1.getMoney() +"이고 사람은" + sw1.getCount() + " 입니다" ); // 지하철의 이름과 잔액, 사람수를 가지고온다
	
	
	
	
	}

}

static 변수

객체 생성 전의 메모리의 올라가는 값이다 . 메모리에 한번 할당되어 프로그램이 종료될때 해제되는 변수로, 여러개의 객체에서 공유가 가능하다

  • 예제 코드

//Student.java


public class Student {
	String name; // 학생의 이름 변수
	static int money; // 학생의 가진돈의 변수 static으로 선언해서 다른 클래스에서도 사용할 수있게 해준다
	Bus b; // 학생이 어떤 버스를 이용하는지 정보등록을 위해 선언 
    // 여기서 버스 객체를 생성하면 버스 번호는 같아도 다른 버스가 된다
    // 버스를 타는 학생은 버스 정보를 알고있어야 하기 때문에 선언한다
	Subway s;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	
	public void run(Object o) { //Object 객체의 시조. 모든 파생 객체를 담을 수 있다
		if (o instanceof Bus) { // instanceof 받아온 매개변수가 버스 타입인지 확인한다.
			//this.money -= 1000; // 학생의 돈이 1000원 차감된다 <-this를 지워준다
			
			this.b = (Bus) o; // 명시적 형변환 
            // 들어온 객체가 가지고 있는 학생 정보를 타고가는 버스 객체에게 전달한다
			b.setCount(1); // 버스 count에 1을 추가한다
			b.setMoney(1000);// 버스 돈에 1000을 추가한다
			
		}
		else if(o instanceof Subway) { // 받아온 매개변수가 서브웨이인지 확인한다
			//this.money -= 1000;  // 학생의 돈이 1000원 차감된다. <-this를 지워준다
			
			this.s = (Subway)o; // 받아온 매개변수 타입의 정보를 서브웨이로 전달한다
			s.setMoney(1000); // 지하철 money에 1000을 추가한다
			s.setCount(1); //지하철 count에 1을 추가한다.
			
		}
		
		
		
	}
	
	
}

//Bus.java


public class Bus {
	String num;
	int money;
	int count;
	public String getNum() {
		return num;
	}
	public void setNum(String num) {
		this.num = num;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money += money; 
        Student.money -= 1000; 학생 클래스의 머니 변수를 가지고와서 버스가 setmoney해서 1000원 추가될때마다 학생의 잔액도 1000원 감소된다.
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count += count;  //setCount(1)을 하면 count +=1이 된다
	}
	
}
  • 스태틱 변수는 스태틱 방식으로 접근해야하고 값이 공유된다

public class Main {

	public static void main(String[] args) {

	Student s1 = new Student();
	System.out.println(s1.stuNum);
	//The static field Student.stuNum should be accessed in a static way
	//정적 필드 Student.stuNum은 정적방식으로 액세스해야한다
	//스태틱 변수는 객체로 접근하지 않는다
	Student s2 = new Student();
	System.out.println(s2.stuNum);
	Student s3 = new Student();
	System.out.println(s3.stuNum); 
	
	/// 1,1,1씩 출력된다.
	
	
	Student s1 = new Student();
	System.out.println(Student.stuNum);	
	Student s2 = new Student();
	System.out.println(Student.stuNum);
	
	Student s3 = new Student();
	System.out.println(Student.stuNum);
	Student s4 = new Student();
	System.out.println(Student.stuNum);
	Student s5 = new Student();
	System.out.println(Student.stuNum);
	
	//1,2,3,4,5가 출력된다.
	//static 변수는 값이 공유된다
	
	
	}

}

class Student {
	// static int stuNum;
	 int stuNum;
	
	public Student() {
		++stuNum;
	}
}

각 변수의 사용 범위

  • 멤버변수 : 선언위치가 클래스 영역이다
  • 지역변수 : 메소드안에 변수 사용이끝나면 소멸한다.

public class Main {
	int num = 10;// 멤버 변수. 
	static int number = 100;// 객체 생성 이전에 있으므로 어디서든 편하게

// 공유라는 성격은 객체 지향에 반대 되므로 주의.
	public static void main(String[] args) {
		Main m = new Main();// 객체 변수.
		int a = 20;// 지역변수.메소드 내에서 선언하고 메소드 사용이 끝나면 소멸.
		m.outPut2(20);// 일부러 다른 메소드로 전달한 경우.
		System.out.println(m.num);
		System.out.println(Main.number);
	}

	public void outPut() {

		System.out.println(Main.number);
	}

	public void outPut2(int num5) {
		System.out.println(num5);
		System.out.println(Main.number);
	}
}


profile
초보 개발자

0개의 댓글