오늘은 class(static)에 대해서 알아보고 예제 문제를 풀어보도록 하겠습니다.
목차 | |
1. | class |
2. | 예제 문제 |
3. | 느낀 점 |
1. class
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을 만드는 예제 문제를 풀면서 카드를 배열에 어떻게 넣어야 할지 잘 몰랐다. 풀이과정을 듣고난 후 내가 생각해내지 못한 간단한 방법을 알게 되었고, 내가 다른 시각에서 볼 수 있는 방법을 알게 될 수 있었다. 오늘 풀었던 예제 문제들을 복습하면서 비슷한 결의 문제들은 어떤 것이 있는지 더 탐구해보고 싶어졌다.
'Java' 카테고리의 다른 글
Java 기초(method)- AWS 풀스택 과정 46일차 (2) | 2024.09.26 |
---|---|
Java 설정 및 기초- AWS 풀스택 과정 45일차 (4) | 2024.09.25 |
Java 기초(Class) - AWS 풀스택 과정 7일차 (0) | 2024.07.23 |
Java 기초(객체 지향 언어) - AWS 풀스택 과정 6일차 (0) | 2024.07.22 |
Java 기초(String, Method) - AWS 풀스택 과정 5일차 (0) | 2024.07.19 |