[JAVA]JAVA 언어의 특징
자바언어를 이용한 자바 프로그래밍을 생각해보면 객체지향 프로그래밍 OOP(Object Oriented Programming)이라 해도 상관없습니다. 그 이유는 자바언어의 특징을 소개하며 설명을 이어나가겠습니다.
자바 언어는 크게 5가지 특징을 가지는데 아래와 같습니다
- 객체 지향 프로그래밍(OOP)
- 자동 메모리 관리(GC)(가비지 컬렉터)
- 운영체제에 독립적
- 멀티쓰레드 지원
- 동적 로딩 지원
첫번째로 객체 지향 프로그래밍의 대표적인 특징은 아래 4가지가 존재합니다.
상속 (Inheritance) : 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고 기능의 일 부분을 변경해야 할 경우 상속받은 자식클래스에서 해당기능을 재정의(수정)해 사용할 수 있는 것입니다.
다형성 (Polymorphism) : 다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해줍니다. 이를 통해 코드의 재사용, 코드길이 감소, 유지보수가 용이해지는 특징이 있습니다. 여기서 크게 두가지 개념으로 오버라이딩(Overriding)과 오버로딩(Overloading)이 있습니다.
/* **오버라이딩 (Overriding) ** - 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용합니다. */ //부모클래스 class Parent{ public String name; public int age; public void Speak(){ System.out.println("일어나 ~ 학교 가야지 ~"); } } //자식클래스 class Child extends Parent{ public String name; public int age; public void Speak(){ System.out.println("10분만 더 잘게요 ~ "); } } public class Test{ public static void main(String[] args){ //자식 클래스의 객체 생성 Child ch = new Child(); //자식 객체의 변수 설정 ch.name = "아무개"; ch.age = 10; //오버라이딩 함수 호출 ch.Speak(); } }
/* **오버로딩 (Overloading) ** - 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술 */ class marine { public void attack(){ System.out.println("일어나 ~ 학교 가야지 ~"); } public void attack(int damage){ System.out.println(damage + "만큼의 피해를 입힙니다."); } public void attack(String class_name, int damage){ System.out.println(class_name+"이"+damage"만큼의 피해를 입힙니다."); } } public class Test{ public static void main(String[] args){ //marine 클래스의 객체 생성 marine m = new marine(); //매개변수가 없는 attack 메소드 호출 m.attack(); //매개변수가 1개 있는 attack 메소드 호출 m.attack(10); //매개변수가 2개 있는 attack 메소드 호출 m.attack("warrior", 30); } }
캡슐화 (Encapsulation, information Hiding) : 캡슐화는 한 객체에 대해 그 객체가 특정 목적을 위해 필요한 변수나 메소드를 하나로 묶는것을 의미합니다. 즉 접근제한자로 변수를 설정해 함부로 변수의 값을 변경할 수 없게 만들고 대신 getter, setter와 같은 메소드를 통해서 접근할 수 있도록 구현할 수 있습니다.
추상화 (Abstraction) : 공통의 속성, 기능들을 묶어 클래스로구성해 확장성을 넓히는 것을 의미합니다. 추상클래스(추상 메소드를 하나이상 포함한 클래스)를 구성하고 추후의 이 class 또는 interface를 상속받아 구현하여 사용하는 것입니다. 공통 기능으로 묶어서 처음 클래스 또는 인터페이스를 구성했기 때문에 설계에 따라서 확장성이 크게 올라갈 수 있습니다. ex)동물이라는 추상 클래스는 행동 이라는 추상 메소드를 가지고 있고 추후에 양서류 등등으로 나뉘어지더라도 이 행동이라는 추상메소드는 계속 상속받아 각 종류에따라서 다르게 구현될 수 있습니다.
그렇다면 이러한 객체지향 프로그래밍을 쓰는 이유는 무엇인가요? 라는 궁금증이 생길 수 있습니다.
객체지향 프로그래밍은 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.
장단점은 무엇이 있을까? 생각해볼 수 있습니다.
- 장점
- 코드 재사용성 증가 - 상속을 통한 확장성 증가
- 유지보수가 쉬워짐 - 절차 지향 프로그래밍 에서는 코드를 수정해야할 때 하나하나 수정해야하지만 객체지향프로그래밍은 상속받은 부모 클래스의 내용만 수정하면 하위 상속받은 자식클래스의 코드수정을 하지 않아도 됩니다.
- 대형 프로젝트에 적합 - 클래스 단위로 모듈화시켜 개발할 수 있기 때문에 업무분담하기 쉬워집니다.
- 단점
- 처리속도가 상대적으로 느려집니다.
- 객체가 많으면 용량이 커질 수 있습니다.
- 설계시 많은 시간과 노력이 필요합니다.
두번째로 자동메모리관리(GC) 가비지 컬렉션을 설명하겠습니다.
Garbage collection(GC)는 메모리관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중 필요없게 된 영역을 해제하는 기능입니다.
C,C++언어같은 경우 동적할당을 받아 배열또는 객체를 생성하게 될 경우 힙메모리 영역에 저장되고 이 부분의 메모리가 할당된 걸 해제하기위해 개발자가 직접 free해주어야합니다. 그러나 자바언어의 경우에는 모든 객체가 클래스기반이며 참조변수 같은경우에는 기본으로 힙에 저장되기때문에 애초에 힙에 저장되는 값들이 많습니다. 이러한 값들을 주기적으로 관리해주기위해 GC가 존재하기도하며 직접 개발자가 System.gc() 를 호출해서 해제할 수 있으나 권장되지 않는것으로 알고있습니다.
세번째로는 운영체제에 독립적입니다.
이말의 의미를 명확하게 이해하려면 JVM(Java Virtual Machine)을 이해하고 있어야 합니다. 자바의 개발 환경과 배포환경이 다를 경우 프로그램을 다시 컴파일 할 필요 없이 실행가능합니다. 그 이유는 JVM은 별도의 Java Compiler를 통해 사용자의 코드를 Byte코드로 변환하고 모든 자바 프로그램은 이론적으로 CPU나 운영체제의 종류와 무관하게 동일하게 동작합니다.
마지막으로 동적로딩, 멀티쓰레드 지원 입니다.
자바는 한 프로그램 내에서 여러 쓰레드가 동작할 수 있는 환경을 제공합니다. C,C++은 운영체제의 도움을 받아 멀티쓰레드를 지원하지만 자바는 이런 운영체제의 지원없이 멀티쓰레드를 이용한 프로그래밍이 가능합니다.
멀티쓰레드를 구현하는 방식음 다음과 같이 두가지가 있습니다.
1) Thread Class (화이트박스 방식)
- 자바에서 쓰레드를 만들기위해 Thread Class 를 상속받아 쓰레드를 생성합니다.
2) Runnable Interface (블랙박스 방식) - 위 화이트박스 방식과 비슷하게 Thread class와 같이 자바에서 스레드를 실행시키는 인터페이스 이며 다중상속이 지원되기 때문에 Thread class보다 많이 사용됩니다.
추가로 저는 C,C++에서 철학자 문제를 가지고 멀티쓰레드와 멀티 프로세스개념을 이해하며 학습한 적이 있는데 이러한 멀티쓰레드와 멀티프로세싱은 교착상태(데드락)문제를 중요하게 다루고있습니다. 여러개의 쓰레드 또는 프로세스가 공유자원을 이용할 때의 문제점을 다루는 것인데 그당시는 뮤텍스, 세마포어를 활용해 이러한 공유자원문제를 해결하는 방식을 학습했던 적이 있었습니다. 중요한 개념인 만큼 밑에 깃허브 링크를 남겨두겠습니다.
지금은 이런게 있구나 기억하고 넘어가시는게 좋을 것 같습니다.
철학자 문제 - https://github.com/ukjinlee66/42_Philosophers
동적로딩(Dynamic Loading)은 어플리케이션이 실행될 때 모든 객체가 처음부터 생성되지 않고 필요한 시점에서 동적로딩을 통해 생성되는 개념입니다. 이러한 동적 로딩은 클래스를 일부 변경하더라도 재 컴파일을 하지 않아도 되는 장점이 있고 적은 작업으로 처리할 수 있는 유연성을 동적로딩이 제공합니다. 그러나 말 그대로 시점에 따라서 그때그때마다 생성이된다면 당연히 그 시점에 메모리에서 불러오기에 속도가 정적로딩에 비해 느린 편이고 이런 느린 속도를 해결하기위해 Static 키워드를 사용합니다.
Reference
'JAVA' 카테고리의 다른 글
Java - Logging 이란? (1) | 2024.11.12 |
---|---|
[JAVA & Database] JDBC, MyBatis, JPA 의 차이점 (1) | 2022.09.26 |
[JAVA]직렬화 - Serializable란? (0) | 2022.05.16 |
[JAVA]DAO, DTO, VO 정리. (0) | 2021.12.25 |