Java 언어의 특성 및 장단점

Updated:

Java 장단점 및 특징 정리

장점


  1. 객체 지향 언어로서 클래스 계층 구조, 상속성, 다형성, 캡슐화 등을 지원
  2. 멀티 스레드
    • C,C++ 많은 언어들은 자체적으로 멀티 스레드를 지원하지 않고, 운영체제의 도움을 받음
    • 반면 자바의 경우는 운영체제 도움 없이 독립적으로 실행이 가능하다 함!!
  3. 플랫폼 독립성
    • 하드웨어, 운영체제 등 플랫폼에 종속되지 않는 독립적인 바이트 코드로 컴파일됨
    • 자바 가상 머신(JVM)만 있으면 하드웨어 운영체제와 상관없이 자바 프로그램 실행 가능

단점


  1. 예외 처리
    • 프로그램 발생 시 발생 할수 있는 예외들을 개발자가 직접 처리해야 한다. 그렇지 않으면 아예 컴파일이 안됨
  2. 컴파일 단계에서 속도가 느림
    • JVM에 의해 기계어로 번역되고 실행되는 과정을 거쳐서, 컴파일되자마자 기계어로 변환되는 C,C++에 비하면 속도가 현저히 떨어진다
    • 그러나 요즘은 바이트 코드를 기계어로 변환해주는 JIT컴파일러 적용 기술의 발전으로 인해, 그 차이가 많이 줄어들었다고는 한다

특징


실행 모듈

  • 자바 응용 프로그램은 한 개의 클래스 파일 또는 다수의 클래스 파일로 구성됨
  • 자바의 실행은 main 메소드에서 시작되며, 오직 한 개의 main 메소드를 가져야 하지만
  • 다수의 클래스 파일이 각각 main 메소드를 가질수 있다!

캡슐화

  • 자바는 객체지향 언어의 캡슐화(encapsulation)을 지켜 변수나 메소드는 반드시 클래스 내에 구현되어야 한다
  • 그래서 클래스에 속하지 않는 변수나 메소드는 존재 불가능!
  • 클래스 내에 또다른 클래스를 만들수 있다

패키지

  • 서로 관련 있는 클래스들을 패키지로 묶어 관리할수있다, 마치 파일시스템과 유사함
  • 예를 들어, java.lang.System Class는 java\lang 폴더의 System.class 파일을 나타내고, java.lang을 패키지라 한다

GC(Garbage Collector)

  • 사용하지 않는 객체는 자동적으로 GC에 의해 인식되어 자원을 반납합
  • 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 자원을 해제하는 기능
  • Reference Counting기법을 이용함

장점

  • 메모리 누수(memory leak)를 막을수 있다.
  • 이중 해제(이미 해제된 메모리를 또 해제하는 것)을 막을 수 있다
  • 유효하지 않은 포인터에 대한 접근을 막을 수 있음(이미 해제된 메모리에 접근)

단점

  • 어떤 메모리를 해제해야 할지 결정하는데 비용이 든다
  • 쓰레기 수집을 일어나는 타이밍을 예측하기 어렵다
  • 할당된 메모리가 해제된 지점을 알 수가 없다

풍부한 오픈소스 라이브러리

  • 오픈 소스로 이루어져있기에, 라이브러리가 굉장히 많음
  • 즉, 여러 라이브러리 들을 이용해 개발 시간을 줄일수 있다

동적 로딩

  • 미리 객체를 만드는 것이 아니라 필요한 시점에 만들 수 있다

함수 스타일 코딩 지원

  • 자바 8부터 함수적 프로그래밍을 위해 람다식 지원함

소스와 클래스 파일

  • 하나의 자바 소스 파일에 여러개의 클래스를 작성한 경우, 컴파일하면 클래스마다 별도의 클래스 파일들이 생성된다
public class A {

...
}
class B {
...
}
class C {
...
	class D {
		...
	}
}

이 경우 A.class, B.class , C.class , 그리고 C$D.class가 생성된다.
D class는 C Class의 inner class 이다
그리고 하나의 자바 소스 파일에 작성된 클래스 중 오직 한 클래스만 public으로 선언이 되어있어야함!!
그리고 그 public으로 선언된 클래스 파일이름과 자바 소스 파일이 일치해야한다


접근 지정자

  • private : 클래스내에서만 가능
  • default : 클래스내 + 동일 패키지
  • protected : 클래스내 + 동일 패키지 + 하위클래스
  • public : 모든곳 가능

기본값은 default 접근 지정자 같다


Area

  • stack area : 함수 호출 시 생성되는 지역변수나 매개변수가 저장되는 영역,
    함수 호출이 완료되면 사라진다는 특징을 지님
  • heap area : 프로그래머가 동적으로 할당된 메모리, 런타임시(프로그램이 실행되는 동안) 결정됨
  • Data area : 전역변수 , static 변수가 할당되는 곳 여기서 잠깐

    전역 변수(global variable)와 정적변수(static variable)의 차이?

  • 해당 프로그램이 죽을 때까지 한번 할당된 변수 메모리와 값은 유지
  • scope가 다르다는 것이 차이

전역변수는 해당 프로그램의 어디든 가능!!
그러나 정적 변수는 변수가 선언된 파일이나 함수 내에서만 접근 가능
예를 들면, class A의 static variable은 class B로 접근이 불가


궁금하신 사항은 댓글을 남겨주시면 감사하겠습니다^^
잘못 된점 이 있다면 댓글 남겨주시면 감사드리겠습니다

Leave a comment