객체지향은 우리가 살고 있는 세계를 모델링으로 한 개발 방법으로 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인 "객체"들의 모임으로 바라보는 것이다.
[출처] 휴몬랩 메이커 연구소
객체지향 말고 절차지향도 있는데, 절차지향은 위의 차트처럼 시작 기준에서 순서대로 프로그래밍 진행하며, 순서가 틀리거나 중간에 오류가 생기면 전체 프로그래밍에 오류가 발생하여 순차적인 처리가 중요시되는 방식이다
반면에 객체지향은 순서와 상관없이 독립적으로 객체들이 상호작용하여 설계할 수 있으며 하나의 객체에 오류가 있어도 다른 객체에는 영향을 미치지 않게 된다.
객체지향 프로그래밍에는 크게 클래스, 객체로 구성된다.
객체를 정의한 설계도
객체를 생성하는 것으로 속성과 메서드를 정의해 놓으면 인스턴스 생성을 통해 여러 종류의 객체를 생성해낼 수 있다.
클래스 - 붕어빵 틀
객체 - 팥 붕어빵, 슈크림 붕어빵, 피자 붕어빵
클래스 구성요소
인스턴스는 클래스에서 만들어진 객체
클래스에서 객체를 만드는 과정을 인스턴스화라고 하며, 보통 객체 = 인스턴스의 의미로 쓰인다.
속성과 기능이 다른 객체와 명확히 구분할 수 있어야 한다.
// 클래스
class Person {
// 멤버 변수
String name;
String sex;
int age;
// 생성자
Person(String name, String sex, int age) {
this.name = name;
this.age = age;
this.sex = sex;
}
// 메서드
void getName(String name) {
System.out.printf("내 이름은 %s이다.\n", name);
}
// 메서드
String getPersonInfo() {
return String.format("name: %s, sex: %s, age: %d", name, sex, age);
}
}
public class Korean {
public static void main(String[] args) {
// 인스턴스 생성
Person person = new Person("김하니", "female", 25);
// 메서드 호출
person.getName("홍길동");
System.out.println(person.getPersonInfo());
}
}
위에서 말한 것은 객체 지향 프로그래밍이라기보다는 객체지향에 대한 설명에 가깝다 객체 지향 프로그래밍은 객체지향 프로그래밍의 3요소가 잘 어우러진 프로그램을 뜻한다.
관련이 있는 변수와 메소드를 클래스로 묶어 정보를 은닉한 것
객체에 직접 접근하는 것, 외부에서 내부 정보에 접근하는 것을 막고 오직 객체게 제공하는 필드와 메소드를 통해서만 접근이 가능하다
상위 클래스의 변수와 메소드를 자식 클래스가 이어 받는 것
코드를 줄일 수 있어 효율성 개선
한 객체가 여러가지 모습을 갖는 것
Overrriding
상속받은 메소드 내 역할을 새롭게 정의하는 것
talk()메소드가 있다면 A의 talk()는 빠르게 말하는 것이고, B의 talk()는 여리게 말하는 것으로 역할의 재정의할 수 있다.
→ 상속을 통해 기능을 쉽게 확장할 수 있다
Overloading
하나의 클래서에서 같은 이름의 메소드를 여러개 가질 수 있는 것
class Person에서 eat() 메소드를 eat(껌)일 수도 있고 eat(고기)일 수도 있고 eat(껌, 고기)가 될 수도 있는 것이다.
→ 코드의 양을 줄여준다
(다형성 보장이 안된다면 eatGum(), eatMeat()처럼 메서드를 나눠서 처리해야한다)
Java Virtual Machine의 줄임말로 Java Byte Code를 OS에 맞게 해석해주는 역할을 한다. Java Compiler가 .java파일을 Java byte code(.class)로 변환해주면 기계어가 아닌 Java byte code를 OS가 이해할수 있도록 JVM에서 해석 해준다.
Byte Code는 JVM에 의해 OS 종류와 상관없이 실행되기 때문에 OS에 종속적이지 않고 자바 파일을 하나만 만들면 어느 장치에서든 JVM 위에서 실행 할 수 있는 장점을 가지고 있다.
프로그램이 실행되면 JVM이 OS로부터 프로그램이 필요로 하는 메모리를 할당받는다
JVAM은 메모리를 용도에 따라 여러 영역으로 나눠서 관리를 시작한다
자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들인 후 Java byte code(.class)로 변환한다
Class Loader가 .class 파일들을 JVM에 로딩시킨다
로딩된 .class 파일이 Execution engine을 통해 해석된다
해석된 Java byte code(.class)가 Runtime Data Areas에 배치되어 실행된다