본문 바로가기
Java

주요 부분 요약 정리

by taehee.kim.dev 2020. 5. 26.
  • 컴퓨터의 CPU는 0과 1로 이루어진 이진수 밖에 이해하지 못한다.
  • 이진수 명령어들로 구성된 언어를 기계어라고 한다.
  • 기계어 -> 어셈블리어 -> 고급 언어 순으로 사람이 이해하기 쉽다.
  • 절차 지향 언어 -> 객체 지향 언어
  • 자바 언어는 C/C++ 언어 구조를 차용하였다.
  • 컴파일 : 고급 언어 -> 기계어(이진수)
  • 고급 언어로 작성된 소스 파일 확장자 = .java
  • 자바 전용 컴파일러에 의해 컴파일된 이진수 파일 = .class
  • .class 파일은 자바 가상 기계(JVM)에 의해 실행된다.
  • 자바 스크립트는 컴파일 없이 인터프리터에 의해 실시간으로 실행되는 스크립트 언어이다.
  • 자바 이전 : 플랫폼 종속적, 플랫폼 간 호환성이 없다. 플랫폼에 따라 다시 소스를 컴파일하거나 아예 프로그램을 재작성해야 했다.
  • 플랫폼에 독립적인 언어의 필용성 대두, 매우 적은 양의 메모리만 사용해야 한다.
  • 원래 자바는 가전제품용 소프트웨어 목적으로 개발되었다.
  • 자바는 플랫폼 독립적이며, 메모리 사용량이 적다.
  • 자바 이전의 C/C++은 컴퓨터의 CPU와 운영체제에 종속적이다.
  • 다른 CPU나 운영체제에서 실행하려면 다시 컴파일하거나 플랫폼에 맞도록 코드를 수정해야 한다.
  • 즉, 플랫폼에 종속적이다.
  • 자바는 플랫폼에 독립적이다. 운영체제나 하드웨어에 상관 없다. 자바 가상 기계(JVM)만 있으면 어디서나 자바로 작성된 프로그램에 동일한 실행 환경을 제공한다.
  • 자바의 플랫폼 독립성 : 자바 가상 기계(JVM)와 바이트 코드 덕분이다.
  • 디어셈블 : 바이트 코드 -> 어셈블리 코드
  • 바이트 코드 : 자바 가상 기계(JVM)에서만 실행되는 기계어(이진수), CPU와도 관계없는 바이너리 코드(이진수)이다.
  • 컴파일 : .java -> .class (바이트 코드)
  • .class 파일은 컴퓨터의 CPU에 의해 직접 실행되지 않고, JVM이 인터프리터 방식으로 실행시킨다.
  • 인터프리터 방식 : 한 문장씩 읽어서 해석해서 실행하는 방식.
  • .class 파일은 운영체제, CPU, 하드웨어 아무것도 상관없다. JVM만 있으면 된다.
  • 자바 가상 기계(JVM)는 소프트웨어이다. 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경을 제공한다. 하지만 이것은 플랫폼마다 서로 다르게 작성되어 배포된다. 즉, 플랫폼 종속적이다. 다양한 회사에서 JVM을 제작 및 공급하는데, 어떤 회사의 것을 쓰든지 상관없다.
  • C/C++과 달리 자바는 링크 과정이 없다. 여러 클래스 파일 중 하나를 지정하여 실행을 시작시키면, JVM은 해당 클래스 파일을 메모리에 로딩하고 실행한다. 실행 도중 필요한 다른 클래스 파일이나 자바 API(라이브러리)가 필요하면, JVM은 그 시점에 그 클래스 파일을 로딩하여 실행한다. 따라서 처음부터 모든 클래스 파일을 로딩할 필요 없이 당장 실행할 클래스 파일만 로딩하여 실행할 수 있으므로, 적은 양의 메모리를 가진 컴퓨터에서 얼마든지 큰 자바 응용프로그램을 실행할 수 있다.
  • 메모리가 충분한 PC에는 실행 중에 클래스 로딩으로 인한 시간을 줄이기 위해, 사용자가 작성한 클래스 파일과 필요한 그 외 자바 클래스 파일을 미리 모두 로딩하여 둔다.
  • ClassLoader 객체를 이용하여 개발자가 직접 클래스를 로딩할 수도 있다.
  • 자바는 단순한 하나의 언어가 아니라, 언어와 컴파일러, 자바 가상 기계 등의 실행 환경을 모두 갖춘 플랫폼이다.
  • 자바에서는 클래스 이름과 소스 파일의 이름이 일치해야 한다. 대소문자를 구분한다.
  • 프로그램 실행은 반드시 main() 메소드부터 시작한다.
  • 자바는 하드웨어, 운영체제 등 어떠한 플랫폼에도 종속되지 않는 독립적인 바이트 코드(JVM에서만 실행되는 기계어(이진수))로, 컴파일되며, JVM만 있으면 어떤 하드웨어, 운영체제든지 자바 프로그램을 실행할 수 있다.
  • 모든 변수나 메소드는 반드시 클래스 내에 구현되어야 한다. 이것을 객체 지향 언어의 캡슐화라고 한다. 자바는 클래스 안에 새로운 클래스, 즉 내부 클래스를 만들 수 있다.
  • .class 에는 반드시 하나의 자바 클래스만 들어있다. 만약 .java 파일에 여러 개의 클래스를 작성하고 컴파일하면, 클래스마다 별도의 .class 파일이 생성된다. 내부 클래스 조차도 별도의 클래스 파일로 생성된다.
  • 하나의 자바 소스 파일에 작성된 클래스 중 오직 한 클래스만 public으로 선언할 수 있다.
  • 소스 프로그램 혹은 소스 파일 : 고급 언어(자바)로 작성된 파일 또는 프로그램.
  • 자바 소스 파일(.java)의 이름은 해당 소스 파일 내에 public으로 선언된 클래스의 이름과 같아야 한다. 대소문자를 구분한다.
  • 자바 응용 프로그램은 한 개 이상의 .class 파일로 구성된다. 여러 개의 클래스 파일을 jar 파일(java archave) 형태로 압축하여 배포하거나 실행할 수 있다.
  • 자바의 실행은 main() 메소드에서 시작된다.
  • 하나의 클래스 파일에는 두 개 이상의 main() 메소드가 존재할 수 없다.
  • 하지만, 각 클래스 파일이 모두 main() 메소드를 하나씩 가지는 것은 상관없다. 
  • 하나의 자바 클래스(class)는 하나의 클래스 파일(.class)로 생성된다.
  • 자바(고급 언어)로 작성된 소스 프로그램 혹은 소스 파일 -> 컴파일러를 통해 컴파일 -> 바이트 코드(JVM에서만 실행되는 기계어(이진수))로 된 클래스 파일 = .class 파일 -> JVM에서 인터프리터 방식으로 실행된다. 컴퓨터의 CPU에 의해 직접 실행되지 않는다.
  • 서로 관련 있는 클래스 -> 패키지로 묶는다. 클래스의 폴더와 같은 개념이다.
  • java.lang.System 클래스는 java\lang 폴더의 System.class 파일을 나타낸다. java\lang을 패키지라고 부른다.
  • C/C++ 등 많은 언어들은 자체적으로 멀티 스레드를 지원하지 않아 운영체제가 멀티스레드를 지원하고 멀티스레드와 관련된 API나 라이브러리를 제공해야만 한다.
  • 하지만 자바는 운영체제의 도움 없이 멀티스레드 프로그래밍이 가능하다. 따라서, 멀티스레드를 지원하지 않는 운영체제에서도 자바를 이용하면 멀티스레드 프로그램을 개발할 수 있다.
  • 가비지 컬렉션 : 프로그램 내에 사용되지 않는 메모리(가비지)는 JVM의 가비지 컬렉션 기능에 의해 자동으로 회수된다.
  • 자바 응용 프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행되므로, 프로그램 실행이 일시적으로 중단된다. 따라서 일정 시간 내에 반드시 실행 결과를 내야만 하는, 속도에 예민한 실시간 시스템에는 자바 언어가 적합하지 않다.
  • 자바 언어는 타입 체크가 매우 엄격하다.
  • C/C++와 달리 메모리의 물리적 주소를 사용하는 포인터의 개념이 없다. 따라서 비교적으로 안전하다. 또한 이 덕분에, 포인터에 대한 부담이 적다.
  • .class 파일은 바이트 코드로 이루어진 파일이다.
  • 최근에는 JVM이 클래스 파일의 바이트 코드를 인터프리터 방식으로 실행하는 것이 아니라, 자바 애플리케이션을 실행하는 도중 자바 프로그램을 해당 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행하도록 하는 JIT(Just In Time) 컴파일링 기법을 이용하므로, 실행 성능이 매우 빨라졌다.
  • 프로그램 또는 소프트웨어는 컴퓨터가 이해하고 처리할 수 있는 일련의 명령들이다.
  • 자바는 오픈 소스 소프트웨어이다.
  • 자바 언어(고급 언어)로 작성된 자바 소스 파일의 확장자는 .java이고, 컴파일된 클래스 파일의 확장자는 .class이며, 컴파일된 코드를 특별히 바이트 코드라고 부른다. 바이트 코드는 자바 가상 기계(JVM) 상에서만 실행되는 기계어(이진수)로서 특정 CPU나 OS에 의존적이지 않기 때문에 WORA(Write Oncce Run Anywhere)를 실현하는 데 기여한다.
  • 하나의 클래스 파일(.class)에는 반드시 하나의 자바 클래스가 컴파일되어 있다.
  • 클래스 바깥에 어떤것도 작성해서는 안 된다.
  • 자바 프로그램은 main() 메소드에서부터 실행을 시작한다.
  • main()은 반드시 public static void 타입으로 선언되어야 한다.
  • 한 클래스에 2개 이상의 main() 클래스를 작성하면 안 된다.
  • 자바 어플리케이션이 여러 클래스로 이루어질 경우, 실행을 시작할 클래스에만 main()을 두면 된다.
  • 지역변수 : 메소드 내에 선언되어 사용되는 변수. 메소드 내에서만 사용되며, 메소드의 실행이 끝나면 소멸된다.
  • 데이터 타입 : 자바에서 다룰 수 있는 데이터의 종류. 기본타입과 레퍼런스타입으로 나뉜다.
  • 레퍼런스 타입의 용도는 3가지이다. 배열에 대한 레퍼런스, 클래스에 대한 레퍼런스, 인터페이스에 대한 레퍼런스.
  • 레퍼런스란 C/C++의 포인터와 비슷한 개념으로 객체를 가리키지만, C/C++와 달리 실제 주소 값을 가지지 않는다.
  • 문자열은 자바의 기본 타입에 속하지 않는다. 자바 라이브러리에서 제공하는 String 클래스를 이용해야 한다.
  • C언어와 같이 플랫폼에 종속적인 언어는 CPU의 처리 능력이나 운영체제에 따라 데이터가 차지하는 메모리 공간의 크기가 달라질 수 있다. 따라서 데이터 타입의 크기가 달라질 수 있다. int 타입은 16비트 CPU에서는 16비트이고, 32비트 CPU에서는 32비트로, CPU나 운영체제에 따라 변한다. 하지만, 자바는 플랫폼 독립적인 언어이므로 CPU의 처리 능력이나 운영체제와 상관 없이, 데이터 타입의 크기가 항상 일정하다. 예를 들면, 자바에서 int 타입은 항상 4바이트로 표현된다.
  • 문자열 + 기본 타입 = 기본타입의 값이 문자열로 바뀐다. 두 문자열이 연결된 새로운 문자열이 생성된다.
  • char c1 = 'a', c2 = 'b', c3 = 'c'; 가능.
  • 리터럴(literal) : 정수, 실수, 문자, 논리, 문자열 : 순수 데이터 그 자체
  • 기본 데이터 타입은 위의 리터럴을 메모리에 직접 저장하는 타입을 말한다.
  • 레퍼런스 타입은 특정 객체를 참조할 수 있는 타입을 말한다. 실제 주소를 가지진 않지만 해당 객체를 찾아갈 수 있는 방법(참조)를 가진다.
  • 정수 리터럴은 int 타입으로 자동 컴파일된다. 만일 long 타입으로 지정하려면 숫자 뒤에 L 또는 l을 붙이면 된다.
  • 실수 리터럴은 double 타입으로 자동 처리된다.
  • 숫자 뒤에 f나 F를 붙이면 float, d나 D를 붙이면 double 타입으로 간제 변환할 수 있다.
  • float f = 0.1234; 는 컴파일 오류이다. float f = 0.1234F; 라고 써야 한다.
  • 문자 리터럴은 ''로 문자를 표현한다.
  • 특수문자 리터럴 : \ 다음에 특수 기호를 붙여서 표현한다.
  • 이스케이프 시퀀스란 : 프로그래밍 언어 특성상 표현할 수 없는 기능, 문자를 표현해준다. 컴퓨터를 제어하는 목적으로 사용되는 특수한 문자이다.
  • 논리 리터럴은 무조건 true, false만 있다. C/C++과 같이 숫자를 참, 거짓으로 사용할 수 없다. 예를 들어, while(1)로 while(true)를 표현할 수 없다.
  • 기본 타입에 null 리터럴을 사용할 수 없다. 예를 들어, int n = null; 은 오류이다. 객체 레퍼런스에만 대입된다.
  • 자바에서 문자열 리터럴을 포함하여 모든 문자열은 String 클래스의 객체이다.
  • Java 10부터 var 키워드 사용 가능. var은 지역변수에서만 사용할 수 있다. var 키워드를 쓰면 변수 선언시 데이터 타입 지정을 생략해도, 자동으로 타입을 추론해서 결정해준다. 하지만 변수 선언문에 초기값이 주어지지 않으면 변수의 타입을 추론할 수 없으므로 오류가 발생한다.
  • 변수 : 변하는 값 < - > 상수 : 변하지 않는 값
  • 상수는 한 번 초기화 되면 그 값을 변경할 수 없다.
  • 상수 선언 : 변수 선언 시 final 키워드를 사용하면 된다.
  • 타입 불일치 시에, 컴파일러는 오류 대신 작은 타입을 큰 타입으로 자동 변환한다.
  • 하지만, 큰 타입이 작은 타입으로 자동 변환되지는 않는다. 오류가 발생한다.
  • 강제 타입 변환 : (변환 목적지 타입 명)변환 당할 데이터
  • 강제 타입 변환을 casting 이라고도 부른다.
  • System.in : 키 입력을 받는 표준 입력 스트림. : 입력된 키를 단순한 바이트의 흐름으로 제공한다.
  • 스트림 : 데이터(자바에서는 바이트 데이터)의 입력, 출력 흐름.
  • 자바 애플리케이션은 바이트 표준 입력 스트림(System.in)으로 부터 받은 바이트 데이터들을 문자로 변환해야 한다.
  • Scanner 클래스 : 바이트 표준 입력 스트림(System.in)으로부터 받은 바이트 정보들을 문자, 정수, 실수, 문자열 등 사용자가 원하는 타입으로 변환해주는 클래스
  • Scanner 클래스는 사용자가 입력하는 값을 공백 문자 (' '(스페이스), '\t'(탭), '\n'(개행문자))를 기준으로 분리하여 읽는다.
  • 토큰 : 문법적으로 더 이상 나눌 수 없는 최소 언어 단위
  • Scanner 객체가 닫히면, System.in도 함께 닫히므로 더 이상 System.in을 사용하여 바이트 표준 입력 스트림을 받을 수 없다.
  • 개발자는 애플리케이션 전체에 Scanner 객체를 하나만 생성하고 공유하는 것이 바람직하다. Scanner 객체를 여러 개 생성해도 이늘은 모두 하나뿐인 System.in을 공유하므로, 한 군데에서 Scanner.close()를 호출하여 Scanner 객체를 닫아버리면 하나뿐인 System.in도 닫혀버려 애플리케이션 내 다른 Scanner 객체에서 키 입력을 받을 수 없게 된다. 
  • switch문에서 case문의 값은 정수 리터럴, 문자 리터럴, 문자열 리터럴만 허용한다. 변수나 식은 사용할 수 없다.
  • 클래스 내의 멤버 함수 = 메소드, 클래스 내의 멤버 변수 = 필드
  • import문 : 사용하려는 클래스의 경로명을 알려줘서, 자바 컴파일러가 사용하려는 클래스가 어디에 있는지 찾을 수 있도록 하는 문장이다.
  • 조건문은 if문과 switch문이 있다.
  • 반복문은 for문, while문, do-while문이 있다.
  • for문의 초기문은 콤마로 분리하여 여러 문장을 나열할 수 있다. 빈 상태로 두어도 된다.
  • for문의 조건식이 비어있으면 true와 같은 효과를 가진다. 즉, 무한반복이 된다.
  • 반복 후 작업문 또한 콤마로 분리하여 여러 문장을 나열할 수 있다.
  • 작업문이 한 줄인 경우는 중괄호를 생략해도 된다.
  • 초기문에 선언된 변수는 for문 내의 지역변수이다.
  • for문은 반복 횟수를 처음에 알 수 있는 경우, while문과 do-while문은 반복 횟수를 알 수 없고 반복 조건만 알 수 있는 경우에 사용.
  • for문과 달리, while, do-while문은 조건식이 없으면 컴파일 오류가 발생한다.
  • main() 메소드는 자바 어플리케이션 이 실행을 시작할 때 자바 가상 기계 JVM에 의해 호출되어야 하므로 public 속성으로 선언되어야 한다.
  • main() 메소드는 자신을 포함하는 클래스의 객체가 생성되기 전에, 처음부터 자바 가상 기계 JVM에 의해 호출되므로 static 속성으로 선언되어야 한다.
  • 자바는 명령행에 입력된 인자들을 문자열 배열로 만들어 main() 메소드에 전달한다.
  • 클래스 : 객체를 만들어내기 위한 설계도 혹은 틀
  • 클래스 모양 그대로 생성된 실체 : 객체 = 인스턴스라고 부름(instance = 사전적인 뜻 : 사례, 경우)
  • 클래스의 구성 요소를 멤버라고 부른다.
  • 멤버는 필드(멤버 변수)와 메소드(멤버 함수) 두 가지이다.
  • 클래스 외부에는 어떤 필드나 메소드를 둘 수 없다. 캡슐화의 원칙 때문이다.
  • 캡슐화 : 객체를 캡슐로 싸서 내부를 보호하는 것. 외부와의 접속을 위해 몇 부분만 공개 노출한다.
  • 접근 지정자를 생략할 때, 디폴드 접근이라고 부른다.
  • 생성자 : 클래스의 이름과 동일한 메소드. 객체가 생성될 때 자동으로 호출되는 특별한 메소드.
  • 자바의 참조 : 실제 어디에 존재하는지 메모리 주소(포인터)는 알 수 없다. 하지만 객체를 찾아갈 수 있는 방법(참조)는 알 수 있다. 따라서 직접 메모리에 접근하여 조작할 수 없다. 유언성과 성능을 희생하는대신 안전성을 선택한 것이다. 이와 같은 이유로 자바는 segment fault가 일어날 수 없다. 
  • 레퍼런스 변수 선언 시, 값은 null로 초기화 된다.
  • new 연산자에 의해 객체가 생성되는 과정 : 해당 클래스 타입 크기의 메모리 할당 -> 해당 클래스의 생성자 코드 실행.

댓글