자바수업 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을 해줌
Author And Source
이 문제에 관하여(자바수업 4일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@0829kuj/자바수업-4일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)