클래스
클래스는 설계도.
실제 사용가능한 객체를 생성.
클래스 선언만으론 메모리에 생성되지 않고, 객체나 인스턴스 변수를 생성하기 전엔 사용할 수 없다.
클래스는 하나의 파일에 여러개 만들 수 있음.
클래스 내에 생성한 인스턴스변수는 객체를 생성하면 생성된다.
객체
객체를 선언하면 실제 메모리에 생성됨.
인스턴스와 비슷한 의미로, 객체가 인스턴스보다 좀 더 넓은 의미임.
같은 패키지에 있는 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);
}
}
클래스 안에 만든 함수.
객체를 생성해야 사용할 수 있다.
메서드명 앞에 리턴타입을 선언해야함.(예 - 문자형: 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나 이름은 다르지만 메서드는 동일
}
}
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);
}
}
접근제어자의 사용으로 접근이 불가능 할 경우 값의 반환과 입력을 가능하게 하는 메소드.
보안상 사용하는 접근제어자의 때문에 getter와 setter를 사용한다고 생각하면 됨(자바수업 6일차 '접근제어자' 참고)
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 객체의 주소값.
참고.
인스턴스의 생성은 연산자 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이 모두 쓰인 예제
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());
}
}
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(">");
}
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;
}
가솔린 8.86L를 충천한 A 자동차는 182.736Km를 운행할 수 있다.
이 차의 연비를 계산하는 메서드를 완성하시오.
코드작성필요
주사위를 세 번 던져 나오는 수 만큼 달러를 획득할때, 주사위를 세 번 던져 얻은 달러와 이를 환전한 결과를 출력하라.
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;
}
체력과 마력이 동시에 동시에 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("아이템을 장착할 수 없습니다...");
}
1이상 6이하의 정수 중 랜덤한 숫자를 리턴
Random random = new Random();
int rand = random.nextInt(6) + 1;
// nextInt(6)은 0~5중 하나를 고르므로 +1을 해줌