객체지향 프로그래밍 특징
- 추상화 : 객체의 불필요한 세부사항을 숨기고, 필요한 인터페이스만을 제공
- 다형성 : 상속 또는 구현 관계에 있을 때, 객체들이 서로 다른 방식으로 동작
- 상속 : 기존의 설계도를 재사용, 하나의 클래스가 다른 클래스의 속성과 메소드를 물려 받음
- 캡슐화 : 객체의 데이터와 메서드를 하나로 묶고, 외부로부터 세부사항 숨기는 것
객체지향 프로그래밍 장점 : 코드의 재사용성, 유지보수성, 유연성과 확장성

public class FunctionTest {
public static void main(String[] args) {
System.out.println("아침에 일어난다.");
교육();
System.out.println("집으로 돌아간다.");
}
public static void 교육() {
System.out.println("오전 수업을 듣는다.");
System.out.println("점심을 먹는다.");
System.out.println("오후 수업을 듣는다.");
}
}
public static void main(String[] args) {
System.out.println("아침에 일어난다.");
이동("교육장", "지하철");
교육();
이동("집", "버스");
System.out.println("집으로 돌아간다.");
}
// 파라미터로 관리
public static void 이동(String where, String how) {
System.out.println(where + "으로 " + how + "를 타고 이동한다.");
}
반환형 함수이름() { ... return '반환값'} public static void main(String[] args) {
System.out.println("아침에 일어난다.");
이동("교육장", "지하철");
boolean 과제 = 교육();
이동("집", "버스");
if(과제) System.out.println("과제를 해결한다.");
}
public static boolean 교육() {
System.out.println("오전 수업을 듣는다.");
System.out.println("점심을 먹는다.");
System.out.println("오후 수업을 듣는다.");
Random random = new Random();
return random.nextBoolean();
}
String yang_name = "Yang";
int yang_age = 45;
String yang_hobby = "Youtube";
String hong_name = "Hong";
int hing_age = 25;
String hong_hobby = "Golf";
int size = 2;
String[] names = new String[size];
int[] age = new int[size];
String[] hobby = new String[size];
names[0] = "Yang";
names[1] = "Hong";
age[0] = 45;
age[1] = 25;
hobby[0] ="Youtube";
hobby[0] ="Golf";
// 각 배열의 연관성을 정할 수 없으므로 실패한다.
이렇게 작성하면 변수가 너무 많고, 배열로 지정하게 되는 경우 연관성이 없어 실패한다.
↓
public class Person {
//class => 변수를 묶어 놓는 것.
String name;
int age;
String hobby;
}
public class PersonTest {
public static void main(String[] args) {
// yang 이라는 변수의 메모리를 갖게 된다.
Person yang = new Person();
yang.name = "Yang";
yang.age = 45;
yang.hobby = "Youtube";
Person hong = new Person();
hong.name = "Hong";
hong.age = 25;
hong.hobby = "Golf";
}
}
class를 통해 객체 생성하여 값을 변경하게 되면, 관리가 쉬워진다.

객체가 할 수 있는 행동을 정의
어떤 작업을 수행하는 명령문의 집합에 이름을 붙여 놓는 것
메서드 선언 : {}
메서드 호출 : Person p = new Person(); 사용하는 경우 p.info()
public class Person {
void study(int time) {
// 호출 시 넘겨준 값이 초기화가 된다.
System.out.println(time + " 시간 동안 공부합니다.");
}
}
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
p.study(10);
// 묵시적 형변환
p.study((short)10);
p.study((byte)2) ;
p.study('a');
}
}
명시적 형변환이 필요한, 매개변수보다 큰 값이 들어가는 경우는 사용할 수 없다.
public class Person {
void study(int time) {
System.out.println(time + " 시간 동안 공부합니다.");
}
void study(long time) {
System.out.println(" 긴" + time + " 시간 동안 공부합니다.");
}
}

매개변수의 값과 종류가 다르면 그에 맞게 사용이 가능하다.
-this() 를 사용하여 같은 클래스의 다른 생성자를 호출할 수 있다.
Dog(String name, int age){
this.name = name;
this.age = age;
}
this 의 경우 현재 메소드에서 갖고 있는 값을 갖고 온다는 것이다.
변수에 이름의 의미가 있는 경우, 매개변수와 필드의 이름을 동일하게 사용하기 위해서.
Dog(String name){
// .이 없이 괄호가 된다면, 갖고 있는 생성자를 호출한다는 것이다
// 제약사항 : 반드시 생성자 본문 첫번째 줄에 있어야 한다.
this(name,5);
}
Dog eat() {
System.out.println("사료를 먹고 ... ");
return this;
}
void drink() {
System.out.println("음료를 마신다.");
}
d.eat().drink() 를 하게되는 경우, eat의 print를 실행하고
this를 다시 return 하여서 drink도 실행 가능하게 된다.