자바수업 4일차

한 일

  • 클래스와 객체
  • 메서드 (method)
  • 메서드 리턴
  • 매개변수가 있는 메서드
  • getters와 setters
  • this
  • private와 public
  • 생성자 (constructor)
  • 생성자 매개변수
  • toString
  • 연습문제

클래스와 객체 Ch06_Method

  • 클래스
    클래스는 설계도.
    실제 사용가능한 객체를 생성.
    클래스 선언만으론 메모리에 생성되지 않고, 객체나 인스턴스 변수를 생성하기 전엔 사용할 수 없다.
    클래스는 하나의 파일에 여러개 만들 수 있음.
    클래스 내에 생성한 인스턴스변수는 객체를 생성하면 생성된다.

  • 객체
    객체를 선언하면 실제 메모리에 생성됨.
    인스턴스와 비슷한 의미로, 객체가 인스턴스보다 좀 더 넓은 의미임.
    같은 패키지에 있는 public클래스는 바로 사용가능.

  • static
    클래스와 다르게 처음부터 메모리에 올라있음.
    자세한건 추후 공부

  • public class는 한 파일에 하나만 생성가능, 파일이름과 같음

  • 인스턴스 변수
    클래스 안의 일반 변수.
    객체를 생성하면 자동생성된다.
    값이 없을 때 초기값은 숫자형은 0, 문자열과 주소값은 null을 갖는다.

package method;
public class App {
	public static void main(String[] args) {
		Person p1 = new Person();
		// 인스턴스 변수의 값이 없을때 자동으로 0(숫자형일때), null(주소값, 문자열일때) 으로 초기화됨
		System.out.println(p1.name);		// 주소값의 초기값인 null이 출력
		System.out.println(p1.age);			// 숫자형의 초기값인 0이 출력
		
		p1.sayHello();		// 메서드 호출
		p1.name = "펭수";
		p1.age = 7;
		
		p1.sayHello();		// 여기서 메서드를 다시 호출하면 name에 "펭수"가 들어간 상태로 출력된다
		
		Person p2 = new Person();
		p2.name = "라이언";
		p2.age = 26;
		p2.sayHello();		// p1이나 p2나 이름은 다르지만 메서드는 동일
	}
}
package method;
public class Person {
	// 클래스 안의 일반 변수 => 인스턴스 변수 (객체 생성시 자동생성)
	String name;
	int age;
	
	// 클래스 안에 만든 함수를 메서드라고 함 => 객체 생성시 사용가능
	// sayHello라는 이름의 메서드를 생성
	void sayHello() {			// 메서드명 앞은 리턴타입임 - 여기는 리턴타입이 없어서 void로 선언
		System.out.println("헬로!" + name);
	}
}


메서드 (method)

클래스 안에 만든 함수.
객체를 생성해야 사용할 수 있다.
메서드명 앞에 리턴타입을 선언해야함.(예 - 문자형: String, 정수형: int, 실수형: double …)

package method;
public class Person {
	// 클래스 안의 일반 변수 => 인스턴스 변수 (객체 생성시 자동생성)
	String name;
	int age;
	
	// 클래스 안에 만든 함수를 메서드라고 함 => 객체 생성시 사용가능
	// sayHello라는 이름의 메서드를 생성
	void sayHello() {			// 메서드명 앞은 리턴타입임 - 여기는 리턴타입이 없어서 void로 선언
		System.out.println("헬로!" + name);
	}
}
package method;
public class App {
	public static void main(String[] args) {
		Person p1 = new Person();
		// 인스턴스 변수의 값이 없을때 자동으로 0(숫자형일때), null(주소값, 문자열일때) 으로 초기화됨
		System.out.println(p1.name);		// 주소값의 초기값인 null이 출력
		System.out.println(p1.age);			// 숫자형의 초기값인 0이 출력
		
		p1.sayHello();		// 여기서 메서드를 호출하면 name에 "펭수"가, age에 7이 들어간 상태로 출력된다
		
		Person p2 = new Person();
		p2.name = "라이언";
		p2.age = 26;
		
		p2.sayHello();		// p1이나 p2나 이름은 다르지만 메서드는 동일
	}
}


메서드 리턴

  • 리턴값이 있는 메서드는 메서드를 선언할 때 메서드의 이름 앞에 리턴값의 변수형이 있어야 한다.
  • 리턴값은 반드시 하나로 고정됨.
  • 리턴값이 없을경우 void, 정수형이면 int, 문자형이면 String 등.
package returnValue;
public class ReturnMethod {
	String getAnimal() {		// String(문자열) 타입으로 리턴됨, 리턴값이 없으면 void, 숫자형이면 int 등
		System.out.println("고양이를 리턴합니다.");
		return "고양이";
	}
}
package returnValue;
public class App {
	public static void main(String[] args) {
		// 리턴값이 있는 메서드 사용
		ReturnMethod r1 = new ReturnMethod();
		String cat = r1.getAnimal();		// 리턴된 값이 cat에 대입됨
		System.out.println("cat 변수는 : " + cat);
	}
}


매개변수가 있는 메서드

  • 매개변수를 지정해준 후 객체를 생성하고 매개변수에 값을 대입한다.
  • 사용: 리턴자료형 메서드명 (매개변수) { 소스코드 }
package parameter;
public class Calculator {
	int square(int x) {	// 매개변수 x, 리턴타입은 정수
		return x * x;	// 입력된 x의 값을 제곱으로 리턴
	}
	int plus(int x, int y) {	// 매개변수 x y, 리턴타입은 정수
		return x + y;	// 입력된 x의 값과 y의 값을 더하여 리턴
	}
	int minus(int x, int y) {
		return x - y;
	}
	int multi(int x, int y) {
		return x * y;
	}
}
package parameter;
public class App {
	public static void main(String[] args) {
		// 매개변수(parameter 파라메터)가 있는 메서드 사용
		Calculator cal = new Calculator();
		int number = 5;
		int result = cal.square(number);	// 메서드 square의 매개변수 x에 number의 값을 대입한 값을 정수형변수 result에 저장
		
		System.out.println("square : " + result);
		result = cal.plus(10, 11);
		System.out.println("plus : " + result);
		result = cal.minus(10, 5);
		System.out.println("minus : " + result);
		result = cal.multi(10, 11);
		System.out.println("multi : " + result);
	}
}


getters와 setters

접근제어자의 사용으로 접근이 불가능 할 경우 값의 반환과 입력을 가능하게 하는 메소드.

get

  • 멤버변수의 값을 리턴하는 메서드.
  • 사용 : get멤버변수명() { return 리턴할값; }

set

  • 값을 입력하는 메서드.
  • 사용 : set멤버변수명(매개변수의타입 매개변수) { 바뀔변수 = 입력할값; }

보안상 사용하는 접근제어자의 때문에 getter와 setter를 사용한다고 생각하면 됨(자바수업 6일차 '접근제어자' 참고)

this

  • 객체 자신의 레퍼런스로, 현재 객체를 의미.
  • 주로 생성자와 메서드의 매개변수 이름이 같을 경우 인스턴스 멤버임을 명시하고자 할 때 사용됨.

public과 private

  • public
    다른 클래스에서 사용가능.
  • private
    다른 클래스에서 접근불가.
    직접 접근할 수 없으므로 get, set 메서드를 이용하여 접근한다.
  • 아래는 get, set 개념과 this, private 개념이 모두 쓰인 예제.
package getterSetter;

public class Person {
	// private는 같은 클래스에서만 접근가능
	private String name;
	private int age;
	
	// public은 다른 클래스에서도 접근가능
	// set은 값을 입력하는 메서드
	public void setName(String name) {
		this.name = name;		// 이때 this는 인스턴스를 의미(여기서는 private String name), = 뒤의 name은 바로 윗줄의 (String name)을 의미
	}
	// get메서드는 값을 리턴하는 메서드
	public String getName() {
		return name;
	}
	
	// set get age만들기
	public void setAge(int age) {	// set은 입력하는 메서드라서 매개변수가 필요한거고
		System.out.println(this);		// this는 new Person의 객체의 주소를 가리키게됨
		this.age = age;
        	// this.age는 Person클래스의 private int age의 age를,
        	// = age;는 public void setAge(int age)의 매개변수 age를 가리킴
	}
	public int getAge() {	// get은 값을 리턴하는 메서드라서 매개변수가 필요없나?
		System.out.println(this);		// this는 p1이 호출하면 p1의, p2가 호출하면 p2의 주소값을 가짐
		return age;
	}
}
package getterSetter;
public class App {
	public static void main(String[] args) {
		// 인스턴스 변수에 접근하는 메서드 get과 set
		Person p1 = new Person();
		// private를 쓰면 보안상 객체의 변수에 바로 접근하지 못함
		// p1.name = "펭수";
		p1.setName("펭수");
		System.out.println(p1.getName());
		p1.setAge(7);
		System.out.println(p1.getAge());
		
		Person p2 = new Person();
		p2.setName("길동");
		System.out.println(p2.getName());
		p2.setAge(42);
		System.out.println(p2.getAge());
	}
}


console의 2, 3, 6, 7번행은 주소값을 출력한다.
여기서 주소값은 해당 메서드가 실행될 때의 new Person 객체의 주소값.


생성자 (constructor)

  • 클래스의 특별한 메서드.
  • 생성자 메서드는 객체를 생성할때 실행된다.
  • 인스턴스의 초기화작업에 주로 사용, 인스턴스 생성 시 실행되어야 하는 작업을 위해서도 사용됨.
  • 조건 1. 생성자의 이름은 클래스와 동일해야 한다.
  • 조건 2.생성자는 리턴값이 없다.
    => 원래 메서드에 리턴값이 없으면 void 커멘드르 추가해야 하지만 생성자는 모두 리턴값이 없으므로 생략가능.

참고.
인스턴스의 생성은 연산자 new의 기능으로, 생성자의 기능이 아님.
생성자는 인스턴스변수들의 초기화에 사용되는 약간 특별한 메서드로, 몇 가지 특징을 제외하면 일반 메서드와 거의 동일하다.

기본 생성자

public Person() {}
생략가능하므로 특별히 만들어주지 않아도 동작함.

생성자 메서드

public + 클래스명(), 리턴타입 없음.

package constructors;
public class Person {
	private String name;
	private double height;
	//public Person() {}	// 기본생성자, 생략가능하므로 특별히 만들어주지 않아도 동작함
	// 생성자 메서드 : public + 클래스명(), 리턴타입 없음
	public Person() {
		name = "익명";			// 초기값을 지정
		height = 170;			// 초기값을 지정, 입력을 받지 않아도 지정해둔 값이 나오도록
		System.out.println("한 사람을 생성!");
	}
	// get set 메서드
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}	
}
package constructors;
public class App {
	public static void main(String[] args) {
		// 생성자 : 클래스의 특별한 메서드
		Person p1 = new Person();
		// 기본 생성자는 생략가능
		p1.setName("펭수");
		p1.setHeight(120.0);
		Person p2 = new Person();
		p2.setName("길동");
		p2.setHeight(176.8);
		Person p3 = new Person();	// p3는 직접 값을 입력하지 않았으므로 기본값이 출력됨

		System.out.printf("이름 : %s , 키 : %.1f \n", p1.getName(), p1.getHeight());
		System.out.printf("이름 : %s , 키 : %.1f \n", p2.getName(), p2.getHeight());
		System.out.printf("이름 : %s , 키 : %.1f \n", p3.getName(), p3.getHeight());
	}
}


맨 아래는 기본값이 출력됨(익명, 170.0)


생성자 매개변수

매개변수가 있는 생성자만 있을 경우 객체를 생성할 때 매개변수를 입력해야함.


toString

  • 객체를 문자열로 변환하는 메서드.
  • 각 클래스는 toString()을 오버라이딩하여 자신만의 문자열을 리턴할 수 있다.
  • get 메서드로 변수값을 하나씩 출력하던 것을 toString을 사용하여 한번에 출력할 수 있다.

~ 오버라이딩 ~
상속관계에 있는 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의하는 것.

아래는 생성자 매개변수와 toString이 모두 쓰인 예제

package constructorsParameter;
public class Person {
	private String name;
	private double height;
	
	//public Person() {}	// 기본생성자, 생략가능하므로 특별히 만들어주지 않아도 동작함
	// 생성자 메서드 : public + 클래스명(), 리턴타입 없음
	public Person() {
		name = "익명";			// 초기값을 지정
		height = 170;			// 초기값을 지정, 입력을 받지 않아도 지정해둔 값이 나오도록
		System.out.println("한 사람을 생성!");
	}
	public Person(String name, double height) {		// 매개변수로 이름과 키를 입력받음
		this.name = name;
		this.height = height;
		System.out.println("한 사람을 생성!");	
	}
	// 위처럼 같은이름의 두 메서드를 만들어도 하나는 매개변수를 쓰고 하나는 쓰지 않으면 다른 메서드로 취급해 두개를 만들어도 에러가 나지 않는다
	
	// toString 메서드
	// get메서드로 변수값을 하나씩 츨력하는 대신 toString 메서드로 한번에 출력가능
	public String toString() {
		return "이름: " + name + ", 키: " + height;
	}
	
	// get set 메서드
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
}
package constructorsParameter;
public class App {

	public static void main(String[] args) {
		// 생성자 : 클래스의 특별한 메서드
		Person p1 = new Person("펭수", 120.0);	// 이렇게 매개변수에 바로 값을 넣으려면 메서드를 지정할때 매개변수를 통해 지정하면 된다
		// 기본 생성자는 생략가능
		Person p2 = new Person("길동", 176.8);
		Person p3 = new Person();

		System.out.println(p1.toString());
		System.out.println(p2.toString());
		System.out.println(p3.toString());
	}
}


메서드 연습문제

1번 line출력

public static void main(String[] args) {
	System.out.println("Line 1");
	threeLines();			// 동일 클래스 내의 메서드이므로 NewLine.threeLine(); 에서 클래스이름을 생략
	System.out.println("Line 2");
}

public static void threeLines() {
	oneLine();
	oneLine();
	oneLine();
}

public static void oneLine() {
	System.out.println(">");
}

2번 칼로리 계산

1) 한 걸음을 걸을 때마다 0.02kcal가 소모된다.
하루 동안 5000걸음을 걸었을 때, 소모된 칼로리량을 계산하는 프로그램을 작성하라.
2) 삼겹살 1인분의 무게는 180g이고, 또 삼겹살 1g의 칼로리가 5.179이다.
삼겹살 3인분의 칼로리를 소수점 이할 둘째자리까지 출력하시오.
hint) 메서드의 리턴타입은 double이다.

public static void main(String[] args) {
	// 1. 칼로리 계산을 위해 메서드를 호출하시오.
	int i = 3;
	double result = calculateCalory(5000);
	double result2 = calculateCaloryPork(i);
	
	// 3. 결과를 출력하시오.
	System.out.println("5000걸음 걸었을 때 소모칼로리: " + result);
	System.out.println("삼겹살 " + i + "인분: " + result2 + " kcal");
}
// 2. 칼로리 계산 메서드를 정의하시오.
private static double calculateCalory(int walk) {
	return 0.02 * walk;
}
private static double calculateCaloryPork(int cal) {
	// 삼겹살 칼로리 계산
	return 180 * 5.179 * cal;
}

3번 자동차 연비

가솔린 8.86L를 충천한 A 자동차는 182.736Km를 운행할 수 있다.
이 차의 연비를 계산하는 메서드를 완성하시오.

코드작성필요

4번 동전내기

주사위를 세 번 던져 나오는 수 만큼 달러를 획득할때, 주사위를 세 번 던져 얻은 달러와 이를 환전한 결과를 출력하라.

  • 요구사항
    Math random() 1과 6까지의 숫자를 반환하는 dice() 메서드를 구현할 것.
    1달러의 환율은 1082.25108원으로 한다.
public static void main(String[] args) {
	double doller = dice() + dice() + dice();
	double won = exchange(doller);
	System.out.printf("획득금액: $%.2f (%.0f원)", doller, won);
//		System.out.println(doller);		// radom메서드 확인용
}

private static int dice() {
	// 1~6 사이의 정수를 반환
	// 방법 1) Math.random() 메서드 사용
//		int rand = (int)(Math.random() * 6) +1;	// random()을 int로 형변환
	// Math.random() : 0.0이상 1.0미만의 값중 하나를 double형으로 반환
	
	// 방법2) java.util에 포함된 Random 클래스를 이용한 방법
	Random random = new Random();
	int rand = random.nextInt(6) + 1; // nextInt(6)은 0~5중 하나를 고르므로 +1을 해줌
	return rand;
}

private static double exchange(double doller) {
	// 입력받은 달러를 원으로 환전하여 반환
	double ex = doller * 1082.25108;
	return ex;
}

5번 레어 아이템

체력과 마력이 동시에 동시에 2000이어야만 착용가능한 아이템이 있다.
체력과 마력을 입력하여 작용결과를 출력하는 메서드 wear()를 완성하고 출력하시오.

public static void main(String[] args) {
	
	Scanner scanner = new Scanner(System.in);
	System.out.printf("hp를 입력해주세요: ");
	int hp = scanner.nextInt();
	System.out.printf("mp를 입력해주세요: ");
	int mp = scanner.nextInt();
	
	wear(hp, mp);
	scanner.close();
}

private static void wear(int hp, int mp) {
	// 체력과 마력이 동시에 2000이 넘는지 체크하여 결과를 리턴하는 메서드
	if(hp >= 2000 && mp >= 2000) 
		System.out.println("아이템 장착 완료!");
	else
		System.out.println("아이템을 장착할 수 없습니다...");

}


랜덤한 정수얻기

java.util에 포함된 Random 클래스를 이용

  • Random 클래스를 선언하여 객체를 생성 후 객체.nextInt(구할값수) +1 으로 구해줌

1이상 6이하의 정수 중 랜덤한 숫자를 리턴

Random random = new Random();
int rand = random.nextInt(6) + 1;
// nextInt(6)은 0~5중 하나를 고르므로 +1을 해줌

좋은 웹페이지 즐겨찾기