Java

Java 기초(Class) - AWS 풀스택 과정 7일차

awspspgh 2024. 7. 23. 18:28

오늘은 class에 대해서 배워보겠습니다.

 

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

 

 

1. class

package day07;

// class 선언 가능

public class Class01 {
	
    // 멤버변수 선언 위치
	
	public static void main(String[] args) {
		/* 클래스의 구성요소 : 멤버 변수, 메서드, (생성자)
		 * 맴버 변수가 먼저, (생성자), 메서드가 뒤에 선언
		 * 클래스 - 설계도
		 * 객체 - 클래스에 의해 생성되는 제품
		 * 메서드 - 객체가 할 수 있는 기능
		 * 
		 * 클래스의 구성요소
		 * - 멤버 변수 : 속성, 정보
		 * - 메서드 : 기능
		 * 
		 * 프린터 클래스
		 * - 속성(멤버변수) : 크기, 색, 제품명, 제조사, 종류
		 * - 기능(메서드) : 인쇄, 복사, 팩스, 스캔
		 * 
		 * 멤버변수 선언 위치
		 * - 클래스 생성 후 메서드 시작 전
		 * - 클래스 가장 위쪽
		 * -멤버변수는 쿨래스 안에서 사용 가능.(클래스에서 생성되는 모든 메서드에서 공통적으로 사용 가능)
		 * 
		 * 객체 생성
		 * - 클래스명 객체명; // 선언만 값은 null
		 * - 객체명 = new 클래스명(); // 선언한 객체의 초기값을 생성자가 설정.
		 * - 클래스명 객체명 = new 클래스명();
		 * 
		 * 메서드 사용법(클래스가 다른 메서드를 호출할 경우)
		 * 객체 선언 후 객체명.메서드명();
		 * 
		 * - 같은 클래스안에서 메서드 호출 => 메서드명();
		 * - 다른 클래스안에서 메서드 호출 => 객체명.메서드명();
		 * 	
		 * 접근제한자(제어자)
		 * - public : 모두 사용 가능
		 * - protected : 나 + 패키지 + 자식클래스
		 * - (default) : 나 + 패키지
		 * - private : 나
		 * 
		 * private < default < protected < public
		 * 
		 * - 클래스에서 public 클래스명 : 파일명과 클래스명이 같을 때만 가능.
		 * - 하나의 java 파일 안에 여러 개의 클래스를 가지는 것 가능함.
		 * - 하지만 public class가 두 개는 불가능.
		 * - 멤버변수, 멤버 메서드는 public을 붙이는 건 문제가 없음.
		 * - 일반적으로 멤버변수는 private, 메서드는 public 선언한다.
		 * - private : 다른 클래스에서 접근 불가능.
		 * - private으로 선언된 멤버변수는 getter / setter라는 메서드를 만들어서 해당 변수에 접근 가능하도록 한다.
		 */
		
		// 외부 클래스를 사용하려면 클래스로 객체를 생성해야 사용가능.
		// 클래스 객체명 = new 클래스명();
		Point p = new Point();        // p라는 객체를 클래스로 선언
		p.print();
//		p.x = 1;
//		p.y = 2;
		
		p.setX(10);
		p.setY(20);
		p.print();
		
		System.out.println(p.getX());
		System.out.println(p.getY());
		
	}

}

// class 선언 가능

※ class

: 같은 package에 있으면 class를 어디서든지 사용할 수 있다. (단, default는 접근제한자를 가지고 있기 때문에 다른 package에서 사용할 수 없다.) => 같은 package에 있는 class끼리는 이름이 달라야한다.

 

▣ 좌표(x,y) 출력하기

// (x,y) 좌표를 출력하는 클래스
// (1,1)
class Point {
	// 멤버변수 위치 (모든 메서드에서 공통적으로 사용)
	// 멤버변수는 초기값을 설정하지 않아도 자동 설정.
	// int 0 / String null / boolean false
	private int x;
	private int y;
	
	// 메서드 위치
	public void print() {
		System.out.println("(" + x + "," + y + ")");
	}

 

◈ getter

	// getter : 멤버변수의 값을 얻어오는 메서드 
	public int getX() {
		// int x = 1;
		// this : 멤버변수를 지칭하는 키워드
		return this.x;
	}
	
	public int getY() {
		return this.y;
	}

 

◈ setter

	// setter : 멤버변수의 값을 변경하는 메서드
	public void setX(int x) {
		this.x = x;
	}
	public void setY(int y) {
		this.y = y;
	}

 

▣ Car class 만들기

public class Class02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Car c = new Car();
		c.setName("Sonata");
		c.setColor("Black");
		c.setYear("2024년식");
		c.print();
		
		c.power();
		System.out.println(c.speedUp());
		System.out.println(c.speedDown());
		c.setSpeed(100);
		System.out.println(c.getSpeed());
		c.setSpeed(0);
		System.out.println(c.getSpeed());
		c.power();

	}

}

class Car{      // 클래스명은 대문자로 시작
	// 멤버변수는 private
	// name, color, year, power, speed
	// power() => 켜져있으면 꺼지고, 꺼져있으면 켜짐
	// speedUP()
	// speedDown()
	// print() => name, color, year 출력
	// getter / setter
	
	private String name;
	private String color;
	private String year;
	private boolean power;
	private int speed;
	
	// print
	public void print() {
		System.out.println(name + " / " + color + " / " + year);
	}
	
	// power on/off
	public void power() {
		if (this.power == false) {
			this.power = true;
			System.out.println("시동이 켜졌습니다.");
		} else if (this.power == true) {
			this.power = false;
			System.out.println("시동이 꺼졌습니다.");
		}
	}
	
	// speed Up
	public int speedUp() {
		speed += 10;
		return speed;
	}
	
	// speed Down
	public int speedDown() {
		speed -= 10;
		return speed;
	}
	
	// getter
	public String getName() {
		return this.name;
	}
	public String getColor() {
		return this.color;
	}
	public String getYear() {
		return this.year;
	}
	public boolean getPower() {
		return this.power;
	}
	public int getSpeed() {
		return this.speed;
	}
	
	// setter
	public void setName(String name) {
		this.name = name;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public void setPower(boolean power) {
		this.power = power;
	}
	public void setSpeed(int speed) {
		this.speed = speed;
	}
	
}

※ getter & setter

: getter와 setter는 class에서 필수이기에 따로 한꺼번에 생성할 수 있다. (class 안에서 우클릭 - Source - Generate Getters and Setters)

 

◈ 생성자

생성자 - 1
생성자 - 2

 

		// 생성자 위치
		// 생성자 public 클래스명(){} => 컴파일을 할 때 자동 생성
		// 생성자를 사용자가 직접 만들게 되면 기본 생성자는 만들지 않음.
		public Car1() {
			// 기본생성자
		}
		
		// 생성자는 여러 개 만들 수 있음. (생성자 오버로딩)
		// 오버로딩 조건 : 매개변수의 개수가 달라야 함, 타입이 달라야 함.
		public Car1(String name) {
			this.name = name;
		}
		public Car1(String name, String color) {
			this.name = name;
			this.color = color;
		}
		public Car1(int door, String year) {
			this.door = door;
			this.year = year;
		}
		public Car1(String name, String color, int door, String year) {
			// 생성자 호출
			this(door, year);
//			this(name, color);
			this.name = name;
			this.color = color;
//			this.door = door;
//			this.year = year;
		}

☆ 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

2. 예제 문제

◎ 문제

▶ 1번

		/* Tv 클래스 생성
		 * 멤버 변수 : brand, power, ch, vol
		 * 브랜드명을 받는 생성자 추가
		 * 
		 * 메서드 :
		 * power() : power가 켜지면 "TV가 커졌습니다." 꺼지면 "TV가 꺼졌습니다."
		 * 
		 * chUp() : 1씩 증가 20까지 있음. 20이 넘어가면 0번으로 순환
		 * chDown : 1씩 감소.. 순환구조
		 * 
		 * volUp() : 1씩 증가 10까지 있고, 10이상은 10으로 고정
		 * volDown() : 1씩 감소 0이면 음소거라고 출력
		 * 
		 * getter / setter
		 */

 

▶ 2번

		/* 두 정수가 주어졌을 때
		 * 두 정수 사이의 모든 합을 리턴하는 메서드
		 * ex) a = 3, b = 5 => 3 + 4 + 5
		 * ex) a = 5, b = 1 => 1 + 2 + 3 + 4 + 5
		 * ex) a = 3, b = 3 => 3
		 * static 메서드
		 * 같은 클래스에서는 그냥 호출 가능.
		 * 다른 클래스에서는 클래스명.메서드명()
		 * 
		 * static 없이 메서드 작업
		 * 같은 클래스라도 객체를 생성하여 객체명.메서드명() 호출
		 */

 

◎정답

▶ 1번

class Tv{
	// 변수
	private String brand;    // final은 변경할 수 없는 값 (대문자) (ex : private final String BRAND) => setter가 없음
	private boolean power;
	private int ch;
	private int vol;
	
	// 생성자(브랜드)
	public Tv(String brand) {
		this.brand = brand;
	}
	
	// brand 출력
	public void print() {
		System.out.println("브랜드: " + brand);
	}
	
	// TV 전원 On / Off
	public void power() {
		if (this.power == false) {
			this.power = true;                            // power = !power
			System.out.println("TV가 켜졌습니다.");
		}else if (this.power == true) {
			this.power = false;
			System.out.println("TV가 꺼졌습니다.");
		}
	}
	
	// 채널 변겅
	public void chUp() {   // 채널 +
		ch ++;
		if (ch > 20) {
			ch = 0;
		}
		System.out.println("현재 채널은 " + ch + "입니다.");
	}
	
	public void chDown() {   // 채널 -
 		ch --;
		if (ch < 0) {
			ch = 20;
		}
		System.out.println("현재 채널은 " + ch + "입니다.");
	}
	
	// 음량 변경
	public void volUp() {   // 볼륨 +
		vol ++;
		if (vol > 10) {
			vol = 10;
			System.out.println("음량의 최대치입니다.");
		} else {
			System.out.println("현재 음량은 " + vol + "입니다.");			
		}
	}
	
	public void volDown() {   // 볼륨 -
		vol --;
		if (vol < 0) {
			vol = 0;
			System.out.println("음소거입니다.");
		} else {
			System.out.println("현재 음량은 " + vol + "입니다.");			
		}
	}
	
	// getter & setter
	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public boolean isPower() {
		return power;
	}

	public void setPower(boolean power) {
		this.power = power;
	}

	public int getCh() {
		return ch;
	}

	public void setCh(int ch) {
		this.ch = ch;
	}

	public int getVol() {
		return vol;
	}

	public void setVol(int vol) {
		this.vol = vol;
	}

}

public class Class04 {

	public static void main(String[] args) {

			// 객체 생성
		Tv tv = new Tv("LG");
		
		tv.print();
		tv.power();
		tv.chUp();
		tv.chDown();
		tv.chDown();
		tv.chUp();
		tv.volDown();
		tv.volUp();
		tv.volUp();
		tv.volDown();
		tv.setVol(19);
		tv.volUp();
		tv.power();
		
	}

}

※ 멤버변수(final)

final은 변경할 수 없는 값, 멤버변수의 이름을 대문자로 표현함. (ex : private final String BRAND) 따라서 setter가 없음.

 

▶ 2번

public class Exam01 {

	public static void main(String[] args) {
		result q = new result();
		q.print(3, 5);
		q.print(5, 1);
		q.print(3, 3);
		

	}

}

class result {
	// 멤버 변수
	private int max;  // 더 큰 값
	private int min;  // 더 작은 값
//	private int answer; // 결과값           // 계산을 실행할수록 누적됨
	
	// 숫자 비교 & 결과값
	public int sum(int num1, int num2) {
		if (num1 >= num2) {
			this.max = num1;
			this.min = num2;
		} else if (num1 < num2) {
			this.max = num2;
			this.min = num1;
		}
		int answer = 0;
		for (int i = min; i <= max; i++) {
			answer += i;
		}
		return answer;
	}
	
	// 출력
	public void print(int num1, int num2) {
		
		if (num1 >= num2) {
			this.max = num1;
			this.min = num2;
		} else if (num1 < num2) {
			this.max = num2;
			this.min = num1;
		}
		System.out.println("a = " + min + ", b = " + max);
		System.out.print( "=> ");
		for (int i = min; i < max; i++) {
			System.out.print(i + " + ");
		}
		System.out.println(max + " = " + sum(num1, num2));
	}
	
	
	
}

※ Math

Math.max(num1, num2), Math.min(num1, num2)를 활용하여 최댓값과 최솟값을 구할 수 있음

 

3. 느낀 점

오늘 문제를 풀면서 오류가 발생하였는데 오류가 발생하는 원인이 class안에 class가 있었기 때문이였는데 이 원인을 알아내느라 시간을 조금 허비하였다. 다음부터는 괄호를 주의깊게 신경 써야겠다는 생각을 하게되었다.