📖 쪽집게 과외
✅ 이것만은 꼭 정리해놓자!
클래스, 인스턴스 개념 / 클래스와 인스턴스의 차이
클래스
클래스는 객체를 만드는 청사진 역할을 한다. 만들어 질 객체와 관련하여 속성과 행위를 기술해 놓는다. 코드를 보면 한결 낫다. Person이라는 클래스는 속성으로 이름 나이 주소를 갖는다. 해당 값들은 클래스에서 정해지지 않는다. 이 클래스를 기반으로 인스턴스를 만들 때 해당 값들이 정해진다.
class Person {
String name;
int age;
String address;
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
public class Main {
public static void main(String[] args) {
Person john = new Person("John", 30, "123 Main Street");
}
}
인스턴스
Person john = new Person("John", 30, "123 Main Street");
윗 부분이 바로 클래스를 통해서 인스턴스를 만드는 작업이다. 보시다시피 만들 때 이름, 나이, 주소가 정해진다. john은 여기서 참조 변수이고 스택에 생성된다. new 연산자로 만든 Person 인스턴스는 heap에 생성된다. 그 인스턴스를 john 변수가 참조한다. 클래스로부터 heap memory에 실질적으로 데이터를 저장하고 있는 것이 인스턴스인 것이다.
메모리 관점에서 참조변수와 인스턴스
여기서 스택과 힙은 JVM 내 RunTimeDataArea 에서의 Stack Area와 Heap Area이다. Stack에 생성되어 저장되는 것은 지역변수와 함수의 매개변수가 있는데 main method 안에서 john은 지역변수이기 때문에 Stack Area에 생성되어 저장된다. 그리고 new Person(...)의 인스턴스는 Heap Memory에 생성된다.
✅ 메서드에서의 return 의 의미
함수 차원에서 함수가 반환하는 것을 의미한다. 아무 것도 반환하지 않을 수 있고 값을 반환할 수도 있다. code snippet 관점에선 메인 루틴 안에 서브루틴이 있을 때 서브루틴이 자신의 프로세스를 종료한 후 메인 루틴으로 소유권을 넘겨주는 맥락에서의 return도 있다. 명령어를 실행시키는 주체는 CPU여서 최종적으로 제어권이 CPU에 있지만 CPU가 명령어를 실행할 때 명령어를 셋단위로 실행하기 때문에 메인루틴 안에 서브루틴이 실행되고 있을 때 현재 CPU는 서브루틴의 명령어 모음집을 실행하고 있기 때문에 서브루틴 관점에서 CPU를 점유하고 있기 때문에 소유권이 있다고 보기도 한다고 한다(?...)
// Calling Code
class Main {
public static void main(String[] args) {
// Subroutine
int result = add(3, 4);
System.out.println(result); // 7
}
public static int add(int a, int b) {
return a + b;
}
}
✅ 생성자에서 사용하는 this의 의미
this는 앞으로 생성될 인스턴스가 된다. 그래서 생성자 메서드에서의 this는 아직 실체가 없다.
✅ 메소드 오버로딩
함수 이름이 같지만 매개변수나 티런 타입을 다르게 설정함으로써 같은 이름의 함수를 사용 목적에 맞게 여러개로 나누어 사용할 수 있는 것을 의미한다. 아래 코드를 보면 이해가 좀 더 용이하다.
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
아이유 프로필 출력하기
class Person {
private final String name;
private final int age;
private final boolean bool;
private final double weight;
public Person(String name, int age, boolean bool, double weight) {
this.name = name;
this.age = age;
this.bool = bool;
this.weight = weight;
}
public void printProfile(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("대학생인가요? : " + bool);
System.out.println("몸무게 : " + weight);
}
}
public class Main {
public static void main(String[] args) {
Person iu = new Person("아이유", 30, true, 40.5);
iu.printProfile();
}
}
아이유 프로필 출력하기2
class Person {
private final String name;
private final int age;
private final boolean bool;
private final double weight;
public Person(String name, int age, boolean bool, double weight) {
this.name = name;
this.age = age;
this.bool = bool;
this.weight = weight;
}
public Person(String name, String age, boolean bool, double weight) {
this.name = name;
this.age = Integer.parseInt(age);
this.bool = bool;
this.weight = weight;
}
public Person(String name, int age, boolean bool, String weight) {
this.name = name;
this.age = age;
this.bool = bool;
this.weight = Double.parseDouble(weight);
}
public Person(String name, String age, boolean bool, String weight) {
this.name = name;
this.age = Integer.parseInt(age);
this.bool = bool;
this.weight = Double.parseDouble(weight);
}
public void printProfile(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("대학생인가요? : " + bool);
System.out.println("몸무게 : " + weight);
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
// 1.
Person iu1 = new Person("아이유", 30, true, 40.5);
iu1.printProfile();
// 2.
Person iu2 = new Person("아이유", "30", true, "40.5");
iu2.printProfile();
// 3.
Person iu3 = new Person("아이유", 30, true, "40.5");
iu3.printProfile();
// 4.
Person iu4 = new Person("아이유", "30", true, 40.5);
iu4.printProfile();
}
}
📖 계산기 만들기
class Calculator {
private final String name;
public Calculator(String name) {
this.name = name;
}
public int add(int a, int b) {
return a+b;
}
public int minus(int a, int b) {
return a-b;
}
public int multiply(int a, int b) {
return a*b;
}
public double divide(int a, int b) {
double A = (double)a;
double B = (double)b;
return A/B;
}
public double divide(String a, String b) {
double A = Double.parseDouble(a);
double B = Double.parseDouble(b);
return A/B;
}
public String getOwner() {
return this.name;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator("제이슨");
System.out.println("이 계산기는 " + calculator.getOwner() + "의 계산기입니다.");
System.out.println("3+4는 " + calculator.add(3, 4) + "입니다.");
System.out.println("6-2는 " + calculator.minus(6, 2) + "입니다.");
System.out.println("2*9는 " + calculator.multiply(2, 9) + "입니다.");
System.out.println("9/4은 " + calculator.divide(9, 4) + "입니다.");
System.out.println("9/4은 " + calculator.divide("9", "4") + "입니다.");
}
}
📖 학생들의 국어, 영어 점수 출력하기
import java.util.ArrayList;
class Student {
private final String name;
private final int korean;
private final int english;
public Student(String name, int korean, int english) {
this.name = name;
this.korean = korean;
this.english = english;
}
public void printInfo(ArrayList<Student> studentArr) {
for (int i = 0; i < studentArr.size(); i++) {
System.out.println("이름 : "+ studentArr.get(i).name);
System.out.println("국어 : "+ studentArr.get(i).korean);
System.out.println("영어 : "+ studentArr.get(i).english);
System.out.println();
}
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Student> arr = new ArrayList<Student>();
Student s1 = new Student("제이슨", 87, 92);
Student s2 = new Student("레이첼", 82, 92);
Student s3 = new Student("리사", 92, 88);
arr.add(s1);
arr.add(s2);
arr.add(s3);
s1.printInfo(arr);
}
}
도서관
import java.util.ArrayList;
import java.util.Scanner;
class Library {
private ArrayList<Book> books;
public Library() {
books = new ArrayList<Book>(100);
for (int i = 0; i < 100; i++) {
books.add(i, null);
}
}
public void addBook(int index, Book book) {
books.add(index, book);
}
public void lendBook(int index) {
Book b = books.get(index);
if (b.getStatus() == false) {
System.out.println("대여 중인 책은 대여할 수 없습니다.");
}
else {
System.out.println("정상적으로 대여가 완료되었습니다.");
b.setStatus(false);
}
}
public void returnBook(int index) {
Book b = books.get(index);
if (b.getStatus() == true) {
System.out.println("대여하지 않은 책은 반납할 수 없습니다.");
} else {
System.out.println("정상적으로 반납되었습니다.");
b.setStatus(true);
}
}
public String printStatus(Book book) {
if (book.getStatus() == true) {
return "대여 가능";
}
return "대여 중";
}
public int powerOn() {
Scanner sc = new Scanner(System.in);
System.out.println("대여할 책의 번호를 입력하세요.");
for (int i = 0; i < books.size(); i++) {
Book b = books.get(i);
if (b != null) {
System.out.println(i + ". " + b.getTitle() + " - " + this.printStatus(b));
}
}
String num = sc.nextLine();
int n;
try {
n = Integer.parseInt(num);
if (n < 0) {
Integer.parseInt("a");
}
} catch (NumberFormatException e) {
System.out.println("양의 정수만 입력해주세요");
return this.powerOn();
}
this.lendBook(n);
return this.powerOn();
}
}
class Book {
private String title;
private boolean available;
public Book(String title, boolean available) {
this.title = title;
this.available = available;
}
public String getTitle() {
return this.title;
}
public boolean getStatus() {
return this.available;
}
public void setStatus(boolean b) {
this.available = b;
}
}
public class Main {
public static void main(String[] args) {
Book b1 = new Book("클린코드(Clean Code)", true);
Book b2 = new Book("객체지향의 사실과 오해", true);
Book b3 = new Book("테스트 주도 개발(TDD)", true);
Library library = new Library();
library.addBook(1, b1);
library.addBook(2, b2);
library.addBook(3, b3);
library.powerOn();
}
}