항해99 | [WIL] 2주차 - 객체지향 프로그래밍, JVM

8691 단어 Java항해99WILJava

객체지향 프로그래밍(OOP)

객체지향은 우리가 살고 있는 세계를 모델링으로 한 개발 방법으로 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인 "객체"들의 모임으로 바라보는 것이다.
[출처] 휴몬랩 메이커 연구소

객체지향 말고 절차지향도 있는데, 절차지향은 위의 차트처럼 시작 기준에서 순서대로 프로그래밍 진행하며, 순서가 틀리거나 중간에 오류가 생기면 전체 프로그래밍에 오류가 발생하여 순차적인 처리가 중요시되는 방식이다

반면에 객체지향은 순서와 상관없이 독립적으로 객체들이 상호작용하여 설계할 수 있으며 하나의 객체에 오류가 있어도 다른 객체에는 영향을 미치지 않게 된다.

1. OOP의 구성 요소

객체지향 프로그래밍에는 크게 클래스, 객체로 구성된다.

클래스(Class)

객체를 정의한 설계도
객체를 생성하는 것으로 속성메서드를 정의해 놓으면 인스턴스 생성을 통해 여러 종류의 객체를 생성해낼 수 있다.

클래스 - 붕어빵 틀
객체 - 팥 붕어빵, 슈크림 붕어빵, 피자 붕어빵

클래스 구성요소

  • 필드(field)
    - 클래스에 포함된 변수
    - 선언된 위치에 따라 멤버 변수(클래스 변수/인스턴스변수)와 지역 변수로 나뉜다
  • 메소드(method) - 객체의 행의를 정의한 문장의 집합
  • 생성자(constructor) - 인스턴스 초기화 메소드

객체 / 인스턴스

인스턴스는 클래스에서 만들어진 객체
클래스에서 객체를 만드는 과정을 인스턴스화라고 하며, 보통 객체 = 인스턴스의 의미로 쓰인다.
속성과 기능이 다른 객체와 명확히 구분할 수 있어야 한다.

예시

// 클래스
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());
 
    }
}

2. 객체지향 프로그래밍의 3요소

위에서 말한 것은 객체 지향 프로그래밍이라기보다는 객체지향에 대한 설명에 가깝다 객체 지향 프로그래밍은 객체지향 프로그래밍의 3요소가 잘 어우러진 프로그램을 뜻한다.

캡슐화(Encapsulation)

관련이 있는 변수와 메소드를 클래스로 묶어 정보를 은닉한 것
객체에 직접 접근하는 것, 외부에서 내부 정보에 접근하는 것을 막고 오직 객체게 제공하는 필드와 메소드를 통해서만 접근이 가능하다

상속(Inheritance)

상위 클래스의 변수와 메소드를 자식 클래스가 이어 받는 것
코드를 줄일 수 있어 효율성 개선

다형성(Polymorphism)

한 객체가 여러가지 모습을 갖는 것

Overrriding
상속받은 메소드 내 역할을 새롭게 정의하는 것

talk()메소드가 있다면 A의 talk()는 빠르게 말하는 것이고, B의 talk()는 여리게 말하는 것으로 역할의 재정의할 수 있다.

→ 상속을 통해 기능을 쉽게 확장할 수 있다

Overloading
하나의 클래서에서 같은 이름의 메소드를 여러개 가질 수 있는 것

class Person에서 eat() 메소드를 eat(껌)일 수도 있고 eat(고기)일 수도 있고 eat(껌, 고기)가 될 수도 있는 것이다.

코드의 양을 줄여준다
(다형성 보장이 안된다면 eatGum(), eatMeat()처럼 메서드를 나눠서 처리해야한다)

3. 객체지향의 장단점

장점

  • 재사용성 - 상속을 통해 코드의 재사용을 높임
  • 생산성 향상 - 클래스를 만들어 독립적인 객체를 사용해 생산성 향상
  • 현실 반영 모델링 - 현실 구조가 객체에 반영되어 있어 생각한 로직대로 구현 가능
  • 유지보수 용이 - 추가, 수정시 캡슐화로 인해 다른 코드에 영향이 적어 유지보수가 쉬워짐

단점

  • 개발속도가 느리다 - 객체 처리에 대한 이해가 필요해 설계가 오래 걸림
  • 코딩 난이도 상승
  • 실행속도가 느리다

JVM

1. JVM이란?

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 위에서 실행 할 수 있는 장점을 가지고 있다.

Java 실행과정[참고]

  1. 프로그램이 실행되면 JVM이 OS로부터 프로그램이 필요로 하는 메모리를 할당받는다

  2. JVAM은 메모리를 용도에 따라 여러 영역으로 나눠서 관리를 시작한다

  3. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들인 후 Java byte code(.class)로 변환한다

  4. Class Loader가 .class 파일들을 JVM에 로딩시킨다

  5. 로딩된 .class 파일이 Execution engine을 통해 해석된다

  6. 해석된 Java byte code(.class)가 Runtime Data Areas에 배치되어 실행된다

좋은 웹페이지 즐겨찾기