본문 바로가기
Programming Language/Java

[국비] Java 내용정리 Day09

by tpleehan 2021. 11. 6.

MethodQuiz02

문제)
1. calcDivisor()라는 메서드를 선언.
2. 이 메서드는 정수 하나를 전달받아서
    해당 정수의 모든 약수를 가로로 출력하고
    약수의 개수를 리턴하는 메서드이다. (가로로 출력은 메서드 내부에서 진행)
3. 메서드 선언을 완료하고, main에서 72의 약수의 개수와 10의 약수의 개수를 출력.
public class MethodQuiz02 {
	static int clacDivisor(int num) {
		int count = 0;
		System.out.print("약수: ");
		for(int i = 1; i <= num; i++) {
			if(num % i == 0) {
				System.out.print(i + " ");
				count++;
			}
		}
		System.out.println();
		return count;
	}
	
	public static void main(String[] args) {		
		System.out.println("72의 약수의 개수: " + clacDivisor(72));
		System.out.println("10의 약수의 개수: " + clacDivisor(10));		
	}

}​

MethodQuiz03

문제)
- 정수 2개를 입력 받아서(main) 두 숫자의 최대 공약수를 구해주는 메서드 calcGCD()를 선언
- 최대공약수: 두 숫자의 공통된 약수 중 가장 큰 약수
   ex) 12, 18의 최대공약수 -> 6
# 임의의 두 자연수 a, b가 주어졌을 때, 둘 중 큰 값이 a라고 가정.
    a를 b로 나눈 나머지를 n이라고 했을 때 (a % b -> n)
    n이 0이 된다면 b가 최대 공약수
# 만약 n이 0이 아니라면 (나누어 떨어지지 않았다면)
   a의 자리에 b값을 다시 넣고 b의 자리에 n의 값을 대입한 후에 위의 행동을 반복
import java.util.Scanner;

public class MethodQuiz03 {
	static int calcGCD(int num1, int num2) {
    
        //무조건 n1이 크다고 가정했기 때문에 n2가 만약 더 크다면 값을 서로 바꿔주는 if문 로직
		if (num1 < num2) {
			int temp = num1;
			num1 = num2;
			num2 = temp;  
		}
		// 방법1.
		while(num2 > 0) {
			int temp = num1;
			num1 = num2;
			num2 = temp % num2;
		}
		
		return num1;
		
		/*
		 방법2.
		 while(num1 % num2 != 0) {
			int temp = num1 % num2;
		 	num1 = num2;
		 	num2 = temp;
		 }
		 return num2;
		 */
	}
	
	public static void main(String[] args) {		
		Scanner sc = new Scanner(System.in);
		System.out.print("num1 입력> ");
		int num1 = sc.nextInt();
		System.out.print("num2 입력> ");
		int num2 = sc.nextInt();
		
		int gcd = calcGCD(num1, num2);
		
		System.out.println("최대 공약수: " + gcd);
		System.out.printf("%d와 %d의 최대 공약수: %d\n", num1, num2, calcGCD(num1, num2));
        
        	sc.close();
	}

}
객체란?
여러가지 속성과 기능을 담고 있는 커다란 데이터 뭉치이고,
객체를 생성하기 위해서 클래스에 어떤 데이터를 보관할지 
그리고 어떤 기능을 구현을 할지 미리 설계도를 그려놓은 다음에
설계도 모양으로 여러 객체를 찍어내는 방식이다.

클래스 : 설계도

  • 클래스는 기본적으로 객체를 디자인하기 위한 설계도이다.
  • 만약 별 모양 빵을 만들어야 한다고 가정하면, 한두 개 정도는 일일이 수작업을 해줄 수 있지만 수 백 개의 을 생산해야 한다면 빵틀을 제작하여 틀로 찍어내는 것이 수월하다.
  • 부품(객체) 또한, 다양한 프로그램에서 자주 사용된다면 틀(클래스)을 만들어 놓고 필요할 때 생성하는 것이 편하다.
※주의※
설계용 클래스는 메인 메소드가 없다.
객체 디자인용 클래스는 메인이 존재하지 않고, 프로그램에는 메인 메소드가 딱 하나의 클래스에만 존재해야 한다.

인스턴스(==객체) : 집

  • 객체 생성 → 'new' 라는 키워드를 사용한다.
  • == 집을 짓는다. (실제 메모리에 세팅)
  • '빵 틀'이 클래스라면 틀로 찍어낸 '빵'객체가 된다.
// 객체 설계용 클래스(라이브러리 클래스)는 메인 메서드를 작성하지 않는다.
public class Pen {
	// 객체의 속성을 필드(멤버변수)라고 부른다.
	String color;
	int price;
	
	// 객체의 기능을 메서드라고 한다.
	void write() {
		System.out.println(color + "색 글을 씁니다.");
	}
	
	void priceInfo() {
		System.out.println(color + "색 펜의 가격은 " + price + "원 입니다.");
	} 
	
}
public class PenMain {
	public static void main(String[] args) {
		// 설계도에 작성한 속성과 기능을 사용하려면
		// 반드시 실체(객체)를 생성해야 한다.
		// 클래스만 제작된 상태에선 아무 기능도 사용할 수 없다.
		
		// 객체 생성 문법: 클래스타입 변수명 = new 클래스이름();
		Pen redPen = new Pen();
		
		// 참조 연산자(.)를 통해 객체로 접근한 뒤 속성을 지정하고 기능을 사용한다.
		redPen.color = "빨간";
		redPen.price = 500;
		
		Pen bluePen = new Pen();
		bluePen.color = "파란";
		bluePen.price = 600;

		redPen.write();
		bluePen.write();
		
		redPen.priceInfo();
		bluePen.priceInfo();
	}

}

멤버 변수(field, class member variable)

1. 클래스 블록에 선언된 변수를 의미한다.
2. 메모리의 heap 영역에 저장되고, 값을 초기화 하지 않아도 각 데이터타입의 기본 값으로 자동 초기화 된다.
3. 객체를 가르키고 있는 레퍼런스변수(참조변수)가 사라지거나
    주소값을 잃어버리게 되면, 메모리에서 가비지컬렉터(gc)에 의해 자동으로 제거된다.

지역 변수 (local variable)

1. 메서드나 생성자 블록 내부에서 선언된 변수를 의미한다. 
2. 메모리의 stack영역에 저장되며, 선언된 블록을 벗어나면
    메모리에서 자동으로 소멸된다.   
3. 값을 초기화하지 않으면 변수를 사용할 수 없다.
public class MemberLocalVariable {
	int a; //멤버 변수
	
	void printNumber(int c) { //매개 변수
		int b = 1; //지역  변수
		System.out.println("멤버변수: " + a);
		System.out.println("지역변수: " + b);
		System.out.println("매개변수: " + c);
	}
	
	public static void main(String[] args) {
		MemberLocalVariable m = new MemberLocalVariable();
		m.printNumber(4);
		
	}

}

생성자 (Constructor)

1. 생성자는 객체를 생성하는 역할을 하며, 클래스 내부에 반드시 하나 이상 존재해야 한다.
2. 만약 생성자를 하나도 존재하지 않는다면 JVM이 자동으로 매개변수가 하나도 존재하지 않는
    가장 기본 형태의 생성자(default constructor)를 하나 만들어 준다.
    생성자를 직접 생성 했다면 기본 생성자를 따로 만들어주지 않는다.
3. 생성자는 반드시 클래스 이름과 대/소문자까지 동일하게 작성하여 선언하고 리턴 타입이 존재하지 않다.
4. 생성자 내부에는 객체가 생성되자마자 해야 할 로직들을 기술할 수 있다.

생성자 오버로딩(중복 선언)

1. 생성자는 중복해서 여러 개 선언이 가능하다.
2. 단, 생성자의 매개변수의 타입, 개수, 순서 중 하나가 달라야 중복을 인정한다.
public class Phone {
	String model;
	String color;
	int price;
	
	//생성자 선언
	Phone() {
		System.out.println("기본 생성자 호출");
		model = "폴더폰";
		color = "회색";
		price = 200000;		
	}
    
	Phone(String pModel) {
		System.out.println("2번 생성자 호출");
		model = pModel;
		color = "화이트";
		price = 1000000;
	}
	
	Phone(String pModel, String pColor) {
		System.out.println("3번 생성자 호출");
		model = pModel;
		color = pColor;
		price = 1200000;
	}
	
	void showSpec() {
		System.out.println("*** 핸드폰의 정보 ***");
		System.out.println("모델명: " + model);
		System.out.println("색상: " + color);
		System.out.println("가격: " + price + "원");
		
	}
	
}
public class PhoneMain {
	public static void main(String[] args) {
		
		Phone basic = new Phone();
		basic.showSpec();
		
		System.out.println("----------------------------");
		
		Phone galaxyS21 = new Phone("갤럭시 s21");
		galaxyS21.showSpec();
		
		System.out.println("----------------------------");
		
		Phone iPhone13Pro = new Phone("아이폰 13Pro", "시에라블루");
		iPhone13Pro.showSpec();
		
	}

}​
문제)
- 빵 객체를 생성할 수 있는 클래스(설계도) 작성
- 클래스 이름은 Bread로 통일한다.
public class MainClass {
	public static void main(String[] args) {
		
		Bread pizzaBread = new Bread("피자빵", 500, "밀가루");
		Bread chocoBread = new Bread("초코케이크", 1500, "초콜렛");
		
		pizzaBread.info();
		System.out.println();
		chocoBread.info();
		
	}

}​
public class Bread {

	String name;
	int price;
	String ingredient;
	
	//직접 기본 생성자를 생성해야 한다.
	Bread() {}
	
	//생성자를 선언 했을 경우 JVM은 기본 생성자를 생성하지 않는다.
	Bread(String bName, int bPrice, String bIngredient) {
		name = bName;
		price = bPrice;
		ingredient = bIngredient;
	}
	
	void info() {
		System.out.println("*** 빵의 정보 ***");
		System.out.println("빵 이름: " + name);
		System.out.println("빵 가격: " + price + "원");
		System.out.println("주 재료: " + ingredient);
	}

}
 
public class Person {

	String name;
	int age;
	int tall;
	
	Person() {}
	
	Person(String pName, int pAge, int pTall) {
		name = pName;
		age = pAge;
		tall = pTall;
	}
	
	void info() {
		System.out.println("이름: " + name);
		System.out.println("나이: " + age + "세");
		System.out.println("키: " + tall + "cm");
	}
	
}
public class PersonMain {
	public static void main(String[] args) {
		
		Person p1 = new Person("홍길동", 20, 180);
		p1.info();
		
		System.out.println("--------------------");
		
		Person p2 = new Person();
		p2.age = 40;
		p2.name = "김길동";
		p2.tall = 170;
		
		p2.info();
		
	}

}

public class Account {

	String name;
	int password;
	int balance;
	
	Account() {}
	
	Account(String aName, int aPassword, int aBalance) {
		name = aName;
		password = aPassword;
		balance = aBalance;
	}
	
	//입금기능
	void deposit(int money) {
		if(money <= 0) {
			System.out.println("입금액은 0원 이상이어야 합니다.");
			return;
		} 
		balance += money;
	}
	
	//출금기능
	void withDrwa(int money, int pw) {
		if (pw == password) {
			if(money > balance) {
				System.out.println("잔액이 부족합니다.");
			} else {
				balance -= money;
			}
		} else {
			System.out.println("비밀번호가 틀렸습니다.");
		}
	}
	
	//잔액조회 기능
	int getbalance() {
		return balance;
	}
}
public class AccountMain {
	public static void main(String[] args) {

		Account myAcc = new Account("홍길동", 1234, 3600);
		
		myAcc.deposit(800);
		myAcc.withDrwa(1900, 1234);
		
		int bal = myAcc.getbalance();
		System.out.println(myAcc.name + "님의 계좌 잔액은 " + bal + "원입니다.");
		
	}

}

'Programming Language > Java' 카테고리의 다른 글

[국비] Java 내용정리 Day11  (0) 2021.11.20
[국비] Java 내용정리 Day10  (0) 2021.11.10
[국비] Java 내용정리 Day08  (0) 2021.11.05
[국비] Java 내용정리 Day07  (0) 2021.11.03
[국비] Java 내용정리 Day06  (0) 2021.11.01

댓글