Java 심화 본문

java

Java 심화

violet4795 2019. 5. 25. 00:48

java의 지식을 되짚어 보는 글.

 

1991년 썬의 엔지니어에 의해 고안된 Oak라는 언어에서 시작

C++의 장점을 도입하고 단점을 보완을 목적으로 개발되었다.

 

#java의 특징


-1. 운영체제에 독립적이다.

기존의 프로그램을 운영체제에 맞춰 다르게 개발해야 했었던 부분을 JVM이라는 중간과정을 통해

JVM이 운영체제에 따라 서로 다른버전을 제공함으로써, 프로그램을 버전별로 나눌 필요가 없어졌다.

 

-2. 객체지향언어이다.

객체지향개념의 특징인 상속, 캡슐화, 다양성이 잘 적용된 순수한 객체지향 언어라는 평가를 받는 언어.

 

-3. 자동 메모리 관리 ( Garbage Collection )

자바로 작성된 프로그램이 실행되면, 가비지컬렉터가 자동적으로 메모리를 관리해준다. 

이로 인해, 프로그램이 비효율적일 수 있으나 메모리 관리에 대한 고민을 덜어냄으로써, 개발효율은 올라갔다고 볼 수 있다.

 

-4. 멀티쓰레드를 지원한다.

일반적인 멀티쓰레드 지원은 사용되는 운영체제에 따라 구현방법도 상이하고, 처리방법도 다르다.

하지만 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과 관계없이 구현 가능하다.

또한 관련 라이브러리가 제공되어 구현이 쉽다.

그리고 여러쓰레드에 대한 스케줄링을 자바 인터프리터가 담당한다.

 

-. 비교적 배우기 쉽다.

자바의 연산자와 기본구문은 C++, 객체지향관련 구문은 스몰톡이라는 객체지향언어에서 가져왔다.

해당 언어들의 장점을 취하고 불필요한 부분은 제거하며 단순화.

객체지향언어의 특징인 재사용성과 유지보수의 용이성 등의 많은 장점에도 불구하고 배우기가 어렵기 때문에 사용자층을 확보하지 못했으나, 자바의 명료한 객체지향적 설계는 객체지향개념을 보다 쉽게 이해하고 활용할 수 있도록 하여 객체지향 프로그래밍의 저변확대에 크게 기여했다.

 

+) 학부시절 C, C++, Java 순으로 배웠는데, 개인적으로는 자바가 C++보다 배우기 어려워서 그때까지만해도 주언어가 C++이었다. 순서에 따른 차이가 있는 것 같다.

 

-. 네트워크와 분산처리를 지원한다.

 

-. 동적 로딩을 지원한다.

 

#JVM

 

자바로 작성된 애플리케이션은 모두 JVM에서만 실행된다. 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.

 

JVM은 설명하자면 하나 더 써야하니까 단순하게 .java 코드를 java compiler가 .class라는 java byte code로 컴파일 시켜준다.

+) java compiler는 자바를 설치할때 javac.exe라는 실행파일로 설치된다.

 

java byte code는 기계어가 아니라서 운영체제가 해석할 수가 없다.

이때 JVM에 있는 인터프린터가 해석을 해준다.

 

TCP SCHOOL - 자바 가상 머신(JVM)의 구성.

 

1. 자바 인터프리터(interpreter)

2. 클래스 로더(class loader)

3. JIT 컴파일러(Just-In-Time compiler)

4. 가비지 컬렉터(garbage collector)

 

자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결됩니다.

이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 클래스 로더(class loader)입니다.

 

+)https://javacan.tistory.com/entry/1 굉장히 상세하게 나와있다. 왜 필요한지가 궁금하다면 여길보면된다.

 

 

JIT 컴파일러(Just-In-Time compiler)란 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러를 의미합니다.

동적 번역(dynamic translation)이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상시키기 위해 개발되었습니다.

즉, JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용합니다.

 

+) https://namu.wiki/w/JIT 

++) JIT 인터프리터라고 보는게 맞다. 런타임과 동시에 기계어로 번역하고, 자주쓰이는 코드를 JVM같은 경우 기계어로 캐싱해둔다. 

 

자바 가상 머신은 가비지 컬렉터(garbage collector)를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 줍니다.

따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 도와줍니다.

 

+) 언제실행되나? 일반적으로 메모리영역이 충분하지 않은데 메모리 사용이 선언될때이지만 플랫폼마다 시점이 다르다.

++)https://ko.wikipedia.org/wiki/%EC%93%B0%EB%A0%88%EA%B8%B0_%EC%88%98%EC%A7%91_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)

 

 

#배열

배열은 어느 언어에서나 특별하게 취급되는 경우가 잦다.

 

-배열의 복사는 for문을 이용한 스위칭보다 System.arraycopy()를 사용하는 것이 효율적이다.

끝... ?

 

 

#객체지향언어

-객체지향언어의 특징

1. 추상화 

2. 캡슐화

3. 상속성

4. 다형성

이다.

 

 

자바를 대강 알고나면... ( 지금의 나 )

추상화, 상속성, 다형성 ? 셋의 구분과 차이점이 이 글을 쓰면서도 구분이 모호했다.

난 이렇게 생각했다. 추상화는 마우스를 컴퓨터 부품이라고 일컫는 것과 같이 한단계 위로 크게보는 것을 일컫는게 아닌가?

음 그게 상속..인데..? 어.. 컴퓨터 부품을 다양하게 나타내는게 다형성이던가? (멘붕)

 

어줍잖은 예밖에 떠오르지 않아서 예시는 생략하고자 한다.

 

1. 추상화

철학적으로 보면 다양한 의미가 있지만 java에서는 

- '객체를 간결하게 표현한 것'이 맞는 표현일것 같다.

- interface와 abstract class로 추상화 구현이 가능하다.

- interface와 abstract class의 차이도 어렵지만 간단히 설명하자면 모든 메소드에 body( {}를 의미 )가 없다면 interface

일부 메소드라도 구현이 되어있다 ( {}가 존재 ) 면 abstract class이다.

- interface는 implements, abstract class는 extends를 class 명 옆에 표기하므로써 구현가능하다.

 

+)http://alecture.blogspot.com/2011/05/abstract-class-interface.html

 

2. 캡슐화

캡슐화는 은닉화가 아니다.

+)https://effectiveprogramming.tistory.com/entry/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%A0%95%EB%B3%B4-%EC%9D%80%EB%8B%89information-hiding%EC%97%90-%EB%8C%80%ED%95%9C-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%9D%B4%ED%95%B4

 

- 캡슐화는 캡슐로 만드는 것이다.

- java에서는 class라는 객체로 필요한 요소(변수)와 동작(메소드)을 감싼다. 이렇게 감싼 메소드 내부 코드는 볼수가 없다.

- 정보 은닉의 일부로서 접근제어자를 사용한다.

- 접근제어자 public, private, protected, default를 통해 숨길수도 드러낼수도 있다. 

private -> default -> protected -> public 순으로 많이 드러난다.

- private : 해당 클래스 내부에서만 접근가능.

- default : 아무것도 선언하지 않았을 경우, default로 설정되며, 해당 패키지 내부에서만 접근가능.

- protected : 동일 패키지내의 클래스 또는 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능하다.

- public : 어떤 클래스에서라도 접근이 가능.

+) https://wikidocs.net/232

 

 

3. 상속성

부모의 성질을 이어받는 것.

- implements와 extends로 이루어진 java의 상속성

- java에서는 다중extends는 허용하지 않는다.

- 하지만 내 유전자는 두분에게 물려받은 것이므로 다중상속의 개념을 구현하기 위해 implements를 통해 다중상속의 개념을 녹였다.

- 정리하자면 extends는 한개만, implements는 두개이상도 가능하다. extends & implements를 같이 사용하는 것도 가능하다.

 

 

4. 다형성

하나의 대상이 많은 형태를 지닌다.

- java에서는 상속을 통한 구현으로서 

- 동물 = new 사자(), 동물 = new 개(), 등의 구현으로서 다형성을 달성한다.

 

링크의 설명이 너무 좋아서 헷갈리면 여기 글을 참조하길바람.

+) https://effectiveprogramming.tistory.com/entry/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%9D%B4%ED%95%B4-%EC%9C%A0%EC%97%B0%EC%84%B1%EA%B3%BC-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-4%EB%8C%80-%ED%8A%B9%EC%84%B1?category=660012

 

 

 

 

 

1. http://tcpschool.com/java/java_intro_programming

 

 

'java' 카테고리의 다른 글

illegal group reference  (0) 2019.08.13
객체의 주소값 비교 메소드 System.identityHashCode Object.hashCode  (0) 2019.01.10
java reflection  (0) 2018.11.30