Java

Java 기초(static) - AWS 풀스택 과정 8일차

awspspgh 2024. 7. 24. 18:19

오늘은 class(static)에 대해서 알아보고 예제 문제를 풀어보도록 하겠습니다.

목차
1. class
2. 예제 문제
3. 느낀 점

 

1. class

static(1)

 

static(2)

 

static(3)

 

static(4)

 

public class Class05 {
	
	/* static
	 * static이 붙은 메서드 / 멤버변수 클래스 멤버변수/메서드 라고 한다.
	 * - 객체의 생성없이 클래스가 만들어지면 생성
	 * - 객체 없이 클래스만으로 사용 가능.
	 * - 클래스명.메서드() / 클래스명.멤버변수
	 * - 객체를 생성해서 호출도 가능하지만 그렇게 사용하진 않음.
	 * - 클래스의 멤버변수 / 메서드는 하나의 멤버변수가 모든 객체에 공유(사용)할 때 사용
	 * 
	 * static이 안 붙은 메서드 / 멤버변수는 객체(인스턴스)의 멤버변수 / 메서드라고 한다.
	 * - 객체의 멤버변수 / 메서드는 반드시 객체를 통해 사용되고, 생성된다.
	 * - 객체를 만들지 않으면 생성이 안된다.
	 * - 객체명.메서드() / 객체명.멤버변수
	 * - 각 객체마다 독립적인 변수 독립적인 메서드를 생성
	 * 
	 * 클래스 / 객체는 생성 시점이 달라서 메서드를 사용할 수 있는 환경이 다르다.
	 * - 객체의 멤버는 클래스가 생성되고, 객체가 생성되고 난 후 사용할 수 있음.
	 * - 클래스 멤버는 클래스가 생성되면 사용 가능.
	 * - 클래스 멤버는 클래스 멤버 / 객체의 멤버에서도 모두 사용될 수 있다.
	 * - 객체의 멤버는 객체에서만 사용될 수 있다.
	 */
	
	public static void main(String[] args) {
		// 클래스 멤버는 현 시점에 이미 생성되어 있음. (객체 없이도 사용 가능)
		Tv.printBrand();    // 클래스 메서드라서 사용 가능.
//		Tv.printPower();    // 객체 메서드라서 사용 불가능.
		Tv t = new Tv();
		t.printPower();
		// 객체를 통해 클래스 멤버에 접근할 수는 있지만 일반적으로 잘 안 씀.
//		t.printBrand();
	}

}

class Tv {
	private boolean power;
	private final static String BRAND = "LG";
	
	// power 출력하는 메서드
	public void printPower() {         // 객체 메서드
		// 객체 메서드에서 클래스 멤버변수 사용 가능.
		// 클래스 멤버는 어디서든 사용 가능.
		System.out.println("Brand: " + BRAND);      // 가능
		if(power) {
			System.out.println("TV가 켜졌습니다.");
		} else {
			System.out.println("TV가 꺼졌습니다.");
		}
	}
	
	// BRAND를 출력하는 메서드
	public static void printBrand() {    // 클래스 메서드
		System.out.println("Brand: " + BRAND);
		// 클래스 메서드에서 객체 멤버변수는 사용 불가능.
//		System.out.println("Power: " + power);  // 불가능
	}
	
}

 

◈ Method

	public static void main(String[] args) {
		/* 메서드 오버로딩
		 *  - 동일한 이름의 메서드를 여러 개 만드는 케이스
		 *  - 오버로딩 조건
		 *  1. 매개변수의 개수가 달라야 한다.
		 *  2. 매개변수의 타입(종류)가 달라야 한다.
		 *  - 리턴타입은 상관없음. 매개변수명도 상관없음.
		 */
		Method07 m7 = new Method07();
		String a = "홍길동";
		System.out.println(m7.sum(10, 20));
		System.out.println(m7.sum(10, 20, 30));
		System.out.println(m7.sum(10, 10.5));		
	}
	
	public int sum(int a, int b) {
		return a + b;
	}
	public int sum(int a, int b, int c) {
		return a + b + c;
	}
	public double sum(int num1, double num2) {
		return num1 + num2;
	}

 

	public static void main(String[] args) {
		/* 가변인자 메서드
		 * - 매개변수의 개수가 고정되어 있지 않는 경우 사용
		 */
		Method08 m8 = new Method08();
		System.out.println(m8.sum(1,2,3,4,5,6,7,8,9));

	}
	
	public int sum(int ...num) {  // num를 배열처럼 처리
		int result = 0;
		for (int a : num) {
			result += a;
		}
		return result;
	}

 

2. 예제 문제

◎ 문제

▶ 1 - 1번 

/* 1장의 카드를 생성하기 위한 클래스
 * - 숫자 : 1(A) ~ 10 J Q K      1 ~ 13
 * - 기호 : ◆, ♥, ♠, ♣
 * 
 * - 한 장의 카드를 출력하는 기능 print() => ♥1
 * ex) ◆12 => ◆Q
 * - 기본 값은 ♥1
 * ex) $1 => ♥1, ♥20 => ♥1
 * - 카드를 생성하면 무조건 ♥1
 */

/* 클래스의 구성
 * - 멤버변수 : 기호(shape), 숫자(num) => private (getter & setter)
 * - 메서드 : print
 * - 생성자 : 기본생성자만 생성 => 카드를 생성하면 무조건 ♥1
 */

 

▶ 1 - 2번

/* 모든 카드 1 set
 * - 숫자 : 1(A) ~ 10 J Q K      1 ~ 13
 * - 기호 : ◆, ♥, ♠, ♣
 * ◆1~13, ♥1~13, ♠1~13, ♣1~13 
 * - 52의 카드 한묶음.(배열생성)
 * 
 * - 카드 출력 - Card class print() 사용
 * - 카드 섞는 기능
 * - 카드 한장을 빼는 기능 => print()
 * - 카드 초기화 기능
 */

 

▶ 2번

	// 5명의 학생 정보를 생성하는 클래스
	// 학생 정보를 출력하는 메서드
	// 생성자
	// getter / setter
	// 지점, 이름, 반, 전화번호

 

◎ 정답

▶ 1 - 1번

public class Card {
	private int num;
	private char shape;
	
	// 생성자
	public Card() {
		this.num = 1;
		this.shape = '♥';
	}

	public int getNum() {
		return num;
	}
	
	// setter 범위제한
	public void setNum(int num) {
		if (num < 1 || num > 13) {
			this.num = 1;
		} else {
			this.num = num;			
		}
	}

	public char getShape() {
		return shape;
	}

	public void setShape(char shape) {
		// ◆, ♥, ♠, ♣ 이외의 모양은 모두 ♥
		switch(shape) {
		case '◆': case '♥': case '♠': case '♣':
			this.shape = shape;
			break;
			default:
				this.shape = '♥';
				break;
		}
	}
	
	public void print() {
		System.out.print(shape);
		// 1 ~ 13 1 => A 11 => J 12
		// 출력 모양 설정
		switch(num) {
		case 1: System.out.println("A"); break;
		case 11: System.out.println("J"); break;
		case 12: System.out.println("Q"); break;
		case 13: System.out.println("K"); break;
		default:
			System.out.println(num);
			break;
		}
	}

 

▶ 1 - 2번

package day08;

/* 모든 카드 1 set
 * - 숫자 : 1(A) ~ 10 J Q K      1 ~ 13
 * - 기호 : ◆, ♥, ♠, ♣
 * ◆1~13, ♥1~13, ♠1~13, ♣1~13 
 * - 52의 카드 한묶음.(배열생성)
 * 
 * - 카드 출력 - Card class print() 사용
 * - 카드 섞는 기능
 * - 카드 한 장을 빼는 기능 => print()
 * - 카드 초기화 기능
 */

public class CardPack {
	// int arr[] = new int[52]
	private Card pack[] = new Card[52];
	private int cnt = 0; // 카드의 배열 index 위치를 체크하기 위한 변수
	
	// 생성자
	public CardPack() {
		// 비어있는 pack[]에 카드를 생성하여 추가
		// ◆1~13, ♥1~13, ♠1~13, ♣1~13
		// 카드 객체 / num shape set
		char shape = '♥';      // int x = 0; 처럼 기본 세팅값
		for (int i = 1; i <= 4; i ++) {
			switch(i) {
			case 1: shape = '◆'; break;
			case 2: shape = '♥'; break;
			case 3: shape = '♠'; break;
			case 4: shape = '♣'; break;
			}
			
			for (int j = 1; j <= 13; j ++) {
				Card c = new Card();
				c.setNum(j);
				c.setShape(shape);
				pack[cnt] = c;
				cnt ++;               // 처리하고나면 52
			}
			
		}	
	}
	
	// 카드 섞는 기능
	public void shuffle() {
		for(int i = 0; i < pack.length; i ++) {
			int random = (int)(Math.random()*pack.length);
			Card tmp = pack[i];
			pack[i] = pack[random];
			pack[random] = tmp;
		}
	}
	
	// 가장 위(마지막)에 있는 카드 한 장을 꺼내서 주는 기능
	// return Card
	public Card pick() {
		if(cnt == 0) {
			return null;
		}
		cnt --;
		return pack[cnt];
	}
	
	// 초기화
	public void init() {
		cnt = 52;
	}
	
	// getter & setter
	public Card[] getPack() {
		return pack;
	}

	public void setPack(Card[] pack) {
		this.pack = pack;
	}

}

 

▷ 출력

package day08;

public class CardMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Card c = new Card();
//		drow.print("◆", 1);
//		drow.print("a", 20);
//		drow.print("♥", 11);
//		drow.print("♠", 12);
//		drow.print("♣", 13);
//		drow.print();
//		drow.setShape('◆');
//		drow.setNum(3);
//		drow.print();
		
		CardPack cp = new CardPack(); // 52장 생성
		
		int cnt = 0;
//		for(int i = 1; i <= 4; i++) {               // 다른 방법
//			for(int j = 1; j <= 13; j++) {
//				cp.getPack()[cnt].print();
//				cnt++;
//			}
//		}
		
		for(Card c1 : cp.getPack()) {
			c1.print();
			cnt ++;
			if (cnt % 13 == 0) {                   // 13번째마다 띄어쓰기 => 4줄
				System.out.println();
			}
		}
		
		System.out.println("--------------------------------");
		
		cp.shuffle();
		
		for(Card c1 : cp.getPack()) {            
			c1.print();
			cnt ++;
			if (cnt % 13 == 0) {               
				System.out.println();
			}
		}
		
		System.out.println("--------------------------------");
		
		(cp.pick()).print();  
		(cp.pick()).print();  
		(cp.pick()).print();  
		(cp.pick()).print();  
		
		System.out.println();
		System.out.println("--------------------------------");
		
		cp.init();
		
		for(Card c1 : cp.getPack()) {
			c1.print();
			cnt ++;
			if (cnt % 13 == 0) {
				System.out.println();
			}
		}
		
	}

}

 

▶ 2번

	public static void main(String[] args) {
		/* 객체를 생성시 값을 초기화 하는 방법
		 * - 기본값, 명시적 초기값, 초기화 블럭, 생성자
		 * 1. 기본값 : 기본적으로 지정되는 값. 0 null
		 * 2. 명시적 초기값 : 변수를 선언함과 동시에 값을 지정하는 방법
		 * 3. 초기화 블럭 :  { } 멤버변수를 초기화
		 * 4. 생성자 : 객체를 생성할 때 초기화 값을 부여해서 생성
		 * 
		 * 초기값의 우선순위
		 * 기본값 -> 명시적 초기값 -> 초기화 블럭 -> 생성자 (가장 우선순위가 높다.)
		 */
		EzenStudent ez1 = new EzenStudent();
//		ez1.print();
		//toString 출력
		System.out.println(ez1);    // toString의 여부 확인 후 있으면 실행
		EzenStudent ez2 = new EzenStudent("서울", "홍길동", "자바", "111");
//		ez2.print();
		System.out.println(ez2);    
		EzenStudent ez3 = new EzenStudent("인천", "AAA", "자바", "222");
//		ez3.print();
		System.out.println(ez3);
		
		
		EzenStudent[] student = new EzenStudent[5];
		student[0] = ez1;
		student[1] = ez2;
		student[2] = ez3;
		
//		System.out.println("--- 전체 학생 명단 ---");
//		for(EzenStudent t : student) {
//			t.print();
//		}
		
	}

}

class EzenStudent {
	private String gigum = "incheon"; // 명시적 초기값
	private String name;  // 기본 초기값 null
	private String group;
	private String phone;
	
	public EzenStudent() {  // 기본 생성자
		
	}

	public EzenStudent(String gigum, String name, String group, String phone) {
		super();
		this.gigum = gigum;
		this.name = name;
		this.group = group;
		this.phone = phone;
	}

	{
		// 초기화 블럭
		gigum = "인천";
		name = "미상";
		group = "미정";
		phone = "000";
	}
	
	public void print() {
		System.out.println("--- 학생 정보 ---");
		System.out.println(name +  " : " + group + "(" + phone + ")");
	}

	//ToSting
	@Override
	public String toString() {
		return "EzenStudent [gigum=" + gigum + ", name=" + name + ", group=" + group + ", phone=" + phone + "]";
	}

 

3. 느낀 점

오늘 CardPack을 만드는 예제 문제를 풀면서 카드를 배열에 어떻게 넣어야 할지 잘 몰랐다. 풀이과정을 듣고난 후 내가 생각해내지 못한 간단한 방법을 알게 되었고, 내가 다른 시각에서 볼 수 있는 방법을 알게 될 수 있었다. 오늘 풀었던 예제 문제들을 복습하면서 비슷한 결의 문제들은 어떤 것이 있는지 더 탐구해보고 싶어졌다.