그림으로 배우는 JAVA 입문내용을 수강 후 , 강사님의 뛰어난 강의력에 반해 2탄을 수강하게 됐다. OOP 는 들을 때마다 새로웠는데, 이번 강의를 통해 확실히 개념을 익혀보자 !



class Dog{
String name;
double weight;
void bark(){
System.out.println("멍");
}
}
Dog dog1 = new Dog();
dog1.name = "뽀삐";
dog1.weight = 3.0;
객체 생성과 메소드 호출
Cat cat1 = new Cat();
cat1.meow(); // "야옹~"클래스 스코프(scope)
class Dog {
String name;
int age;
void bark() {
// 필드 name을 사용
System.out.println(name + "의 멍멍!");
}
}
메소드 스코드(scope)
class DrinkMachine {
String output; // 필드 output 선언
void pushButton(int num) { // 파라미터 num 선언
// 지역변수 drinks 선언
String[] drinks = {"콜라", "사이다", "맥주"};
output = drinks[num];
}
void printOutput() {
System.out.println(output);
}
}
스코프 정리
[요약]

/* 1. 객체 생성 */
Cat c = new Cat();
/* 2. 필드 초기화 */
c.name = "네로";
c.weight = 3.78;
c.age = 3;
/* 객체 생성과 동시에 초기화 */
Cat c = new Cat("네로", 3.78, 3);
생성자 호출
// 클래스_타입 변수명 = new 클래스_이름(전달 값);
Cat c = new Cat("네로", 3.78, 3);
생성자 정의
- 생성자 또한 메소드이므로 사용을 위해 먼저 정의되어야 한다. 일반 메소드와의 차이점은 리턴 타입이 없다는 점 !
class Cat {
String name;
double weight;
int age;
/* 생성자 정의 */
Cat (String s, double d, int i) {
name = s;
weight = d;
age = i;
}
}```
String.format() 메소드
String name = "피자맛";
int price = 1200;
String str = String.format("Goroke { %s, %d원 }", name, price);
System.out.println(str);
// => "Goroke { 피자맛, 1200원 }" ```디폴트 생성자
class Hero {
String name;
int hp;
// 디폴트 생성자
// - 파라미터 및 중괄호 내부 없음
// - 생성자가 없는 경우, 자동 기입 됨
Hero() { }
}

Book naruto = new Book("나루토");
Book onepiece = new Book("원피스");
Book slamdunk = new Book("슬램덩크");
Book[] comics = { naruto, onepiece, slamdunk };
// 객체 생성
Hero ironMan = new Hero("아이언 맨", 30);
Hero captain = new Hero("캡틴 아메리카", 30);
// 아이언 맨의 펀치 -> 캡틴 아메리카
ironMan.punch(captain);
// 캡틴 아메리카의 펀치 -> 아이언맨
captain.punch(ironMan);
class Hero {
String name;
int hp;
Hero(String n, int h) {
name = n;
hp = h;
}
void punch(Hero enemy) {
// 내용 생략
}
}
레퍼런스란 ?
자바에서 변수의 타입은 레퍼런스형(references type) 과 기본형(primitives type)으로 나뉜다.


Static 이란 ?

클래스 변수(Static fields): static 키워드가 필드에 적용된 경우. 객체 밖에 존재한다.
인스턴스 변수(non-static fields): 객체 내부에 존재


클래스 메소드: 클래스가 동작시키는 메소드로 static 적용된 메소드 이다.
인스턴스 메소드: 주 객체가 수행하는 메소드로 static이 없다.
// Math의 클래스 메소드 random() 호출 예
double rand = Math.random();
// 주체 객체 생성
Hero h1 = new Hero("닥터 스트레인지", 80);
// 주체 객체를 통한 인스턴스 메소드 호출
h1.teleport();


class SmartPhone{
//private 필드 - 외부 접근 불가
private int number;
}
// 게터 메소드 - number를 우회하여 반환
public int getNumber(){
return number;
}
// 사용
SmartPhone.getNumber()class SmartPhone{
//private 필드
pirvate int number;
}
// 세터 메소드
public void setNumber(int n){
number = n;
}
// 호출 영역
Cookie c = new Cookie("버터링", 1500);
// 정의 영역
class Cookie {
private String name;
private int price;
public Cookie(String name, int price) {
name = name; // 인스턴스 변수 name 초기화(X)
price = price; // 인스턴스 변수 price 초기화(X)
}
}// 호출 영역
Cookie c = new Cookie("버터링", 1500);
c.setPrice(2000);
// 정의 영역
class Cookie {
private String name;
private int price;
// 생성자
public Cookie(String name, int price) {
this.name = name; // this.name -> 인스턴스 변수
this.price = price; // this.price -> 인스턴스 변수
}
// 세터
public void setName(String name) {
this.name = name; // this.name -> 인스턴스 변수
}
}```API란 프로그래밍을 위해 만들어진 도구, API는 패키지 형태로 제공된다. 패키지는 자바API가 담겨진 일종의 폴더라고 할 수 있다.

Random 클래스
// java.util 패키지의 Random 클래스 불러옴
import java.util.Random;
//객체 생성
Random random = new Random();
// 난수 생성
// 0이상N미만의 임의의 정수
int n = 10;
int randInt = random.nextInt(n); // 0,1,2 ... 9 중 택1
//0.0이상 1.0 미만의 임의의 실수
double ranDouble = random.nextDouble();
//임의의 참/거짓
boolean randBoolean = random.nextBoolean();
ArrayList 클래스
import java.util.ArrayList;//string 저장을 위한 객체 생성
ArrayList<String> names = new ArrayList<String>(); //객체 추가
names.add("kang");
names.add("kim);
//객체 획득
System.out.println(names.get(0)); // kang
System.out.println(names.get(1)); // Kim
//객체 수 반환
System.out.println(names.size()); //2// Employee 객체를 담기 위한 ArrayList 생성
ArrayList<Employee> list = new ArrayList<Employee>();Employee emp4 = new Employee();
list.set(0, emp4); 상속이란, 기존 클래스를 확장하여 새 클래스를 만드는 것.

업 캐스팅이란 자식 객체를 부모의 타입으로 해석하는 것으로 예를들어 아래와 같은 상속 관계가 존재할 때 Cat의 인스턴스(객체)는, Animal로 해석될 수 있다. (역은 성립하지 않음)
class Animal{...}
class Cat extends Animal {. . .}
class Dog extends Animal {. . .}
Cat c = new Cat(); // 고양이 객체 생성
Animal a = c; // 고양이는 동물이다(o). 고양이 객체를 동물로 해석
Animal c = new Cat();
Animal d = new Dog();
//동물배열
Animal[] animals = {c,d};메소드 오버라이딩이란, 부모의 메소드를 자식 클래스에서 재정의하는 것
protected 제한자는 상속 관계의 클래스까지 접근을 허용한다. 아래 코드의 필드 name은 protected 선언되었으므로, B에서 직접 사용할 수 있다.
class A{
protected String name;
}
class B extends A{
public void printName(){
// 부모 클래스 A의 필드 name을 출력 가능
System.out.println(name);
}
}
super - 상속과 생성자
자식 객체를 생성과 동시에 초기화 하려면, 먼저 부모 생성자가 호출돼야만 한다. 이때 super 키워드 사용
//생성자 호출 영역
Wizard w = new Wizard("프로도", 100, 80);
//생성자 정의 영역
class Novice{
protected String name;
protected int hp;
public Novie(String name, int hp){
this.name = name;
this.hp = hp;
}
}
class Wizard extends Novice{
protected int mp
public Wizard(String name, int hp, int mp){
super(name, hp); // 부모 클래스의 생성자 호출
this.mp = mp;
}
}
인터페이스란 역할을 부여하는 것 !

interface Alarm{
//프로토타입 메소드
public void beep(); //추상메소드
public playMusic(); // 추상메소드
}
// 인터페이스를 글래스에 구현
class SmartPhone implements Alarm{
//프로토타입 메소드 재정의
public void beep(){
System.out.println("삑");
}
public void playMusic(){
System.out.println("삑");
}
}
인터페이스와 다형성
하나의 클래스가 여러 개의 인터페이스를 구현할 수 있다. 마치 스마트폰 클래스에 알람, 전화, 메신저의 역할이 부여되는 것과 같다. 이때 'implements' 키워드로 인터페이스들을 쉼표로 구분지어 적어주면 된다. 이때 인터페이스를 구현하기로 선언했다면, 반드시 프로토타입 메소드를 오버라이딩하여 재정의하여야 한다.
이렇게 하나의 객체가 다양한 타입으로 해석되는 것을 다형성이라 한다.

마찬가지로, 인터페이스를 구현하는 객체는 인터페이스 타입으로 업캐스팅될 수 있다.

// 다양한 객체 생성
Bird bird = new Bird();
Helicopter copter = new Helicopter();
Rocket rocket = new Rocket();
// 인터페이스 타입으로 그룹화
Flyable[] flyableThings = { bird, copter, rocket };
//Flyable 타입을 저장할 Arraylist 생성
ArrayList<Flyable> list = new ArrayList<FlyAble>();
//인터페이스를 통한 다양한 하위 객체들 저장
Flyable b = new Bird();
Flyable h = new Helicopter();
Flyable r = new Rocket();
list.add(b);
list.add(h);
list.add(r);