728x90

 

 

  1.  














JDK 설치 화면 

  • 자바 JDK 설치하기

    • 이 책은 실습을 진행하기위해 ORACLE JAVA인 JDK SE 11을 설치합니다. 

    • 오라클 공식 웹 사이트 주소 : https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11

    • 다운로드 링크로 이동하여 [New Downloads- Java SE 11.0.4]를 누르세요. 그러면 선택 한 자바 버전과 운영체제에 맞는 다운로드 메뉴가 나타날 것입니다.

    • 자바 버전이 11인 Client 윈도우 64비트 버전에 맞는 설치 파일을 다운로드 합니다.

    • 다운로드한 설치 파일 jdk-11.0.4_windows-x64_bin.exe를 실행하여 설치합니다. 이때 [Next] 버튼을 한 번 눌러 나오는 화면에서 JDK가 설치되는 경로를 꼭 확인하세요.

    • JDK 설치가 다 되었으면 윈도우 환경 변수인 PATH에 jdk가 설치 된 위치를 등록합니다. 보통은 다음 위치에 JDK가 설치 됩니다.

    • C:\Program Files\Java\jdk-11.0.4\

 

    • 윈도우키 + Pause를 누르면 제어판의 시스템 화면이 나타납니다. [고급 시스템 설정 > 고급 > 환경 변수] 를 순서대로 눌러 이동합니다. 시스템 변수에 있는 [새로 만들기] 버튼을 누릅니다.

    • 새 시스템 변수 편집 화면이 나오면 변수 이름에는 JAVA_HOME을 변수 값에는 JDK 설치 경로를 입력후 [확인] 버튼을 누릅니다.

    • 새 시스템 변수가 추가되 었으면 시스템 변수 목록에 있는 Path 변수를 더블 클릭해서 Path 변수를 선택한 상태로 [편집] 버튼을 누르면 환경 변수 편집 화면이 나타납니다. 여기에서 [새로 만들기] 버튼을 누른 다음 %JAVA_HOME%\bin을 입력합니다. 

    • 제대로 환경 변수가 등록되었는지 확인을 위해 윈도우키+R누르고 cmd라고 입력한 다음 Enter를 누르면 명령 프롬프트 창이 나타납니다. 명령 프롬프트 창에서 다음과 같이 입력 하여 자바 버전에 대한 문구가 나오면 환경 변수가 제대로 등록된 것입니다.

 

5.Parent 클래스를 상속받아 Child 클래스를 다음과 같이 작성 했습니다. ChildExample 클래스를 실행했을 때 호출되는 각 클래스의 생성자의 순서를 생각하면서 출력 결과를 작성해 보세요.

 

 

 

 

객체지향 개념 정리

  •  클래스 : 객체를 만들기 위한 설계도

  • 객체 :  클래스로부터 생성되며 ‘new 클래스()’로 생성합니다.

  • new  연산자 : 객체 생성 연산자이며, 생성자를 호출하고 객체 생성 번지를 리턴 합니다.

  • 클래스 변수 : 클래스로 선언한 변수를 말하며 해당 클래스의 객체 번지가 저장됩니다.

  • 인스턴스 : 객체는 클래스의 인스턴스입니다.

  • 클래스 멤버 : 클래스에 선언되는 멤버는 필드, 생성자, 메소드가 있습니다.

  • 필드 선언 : 클래스 중괄호 {} 블록 어디서든 선언하나, 생성자와 메소드 내부에서는 선언할 수 없습니다.

  • 필드 사용 : 클래스 내부의 생성자와 메소드에서 바로 사용이 가능하나, 클래스 외부에서 사용할 경우에는 반드시 객체를 생성하고 참조 변수를 통해 사용해야 합니다.

  • 기본 생성자 : 클래스 선언 시 컴파일러에 의해 자동으로 추가되는 생성자 입니다.

  • 생성자 선언 :  클래스로부터 객체를 생성할 때 호출되는 생성자를 명시적으로 선언할 수 있습니다. 생성자를 선언하면 기본 생성자는 생성되지 않습니다.

  • 매개 변수 : 생성자 호출 시 값을 전달받기 위해 선언되는 변수를 말합니다.

  • 객체 초기화 : 객체를 사용하기 전에 준비하는 과정으로 필드를 선언할 때 초기화하거나 생성자 내부에서 필드값을 초기화할 수 있으며, 메소드를 호출하는 내용으로 구성됩니다.

  • this() : 객체 자신의 또 다른 생성자를 호출할 때 사용합니다.

  • 선언부 : 메소드 선언부는 리턴 타입, 메소드 이름, 매개 변수 선언 부분을 말합니다.

  • void : 리턴값이 없는 메소드는 리턴 타입으로 void를 기술해야 합니다.

  • 매개 변수 : 메소드 호출 시 제공되는 매개값은 메소드 선언부의 매개 변수에 차례대로 대입되어, 메소드 블록 실행 시 이용됩니다.

  • 리턴문 : 메소드 선언부에 리턴 타입이 있다면 리턴값을 지정하기 위해 return문이 반드시 있어야 합니다. 리턴 타입이 void라면 return문은 필요없지만, 메소드 실행 종료를 위해 사용할 수도 있습니다.

  • 호출 : 메소드를 실행하려면 ‘메소드 이름(매개값, …)’ 형태로 호출해야 합니다.

  • 오버로딩 : 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 합니다. 메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점입니다.

  • 인스턴스 멤버 : 인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데, 이들을 각각 인스턴스 필드, 인스턴스 메소드라고 부릅니다.

  • this : 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있습니다. 예를 들어 this.model은 자신이 가지고 있는 model 필드라는 뜻입니다. this는 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용됩니다.

  • 정적 멤버 : 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말합니다. 이들을 각각 정적 필드, 정적 메소드라고 부릅니다.

  • static : 정적 멤버를 선언할 때 사용하는 키워드 입니다.

  • 싱글톤 : 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있습니다. 단 하나만 생성된다고 해서 이 객체를 싱글톤 이라고 합니다.

  • 패키지 선언 :  해당 클래스 또는 인터페이스가 어떤 패키지에 속할 것인지를 선언하는 것을 패키지 선언이라고 합니다.

  • import문 :  사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면 import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야 합니다.

  • 접근 제한자 : 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 필요가 있습니다. 그리고 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메소드를 사용하지 못하도록 막아야 되는 경우도 있습니다. 이때 접근 제한자를 사용할 수 있습니다.

  • Getter/Setter  : 필드는 외부에서 접근할 수 없도록 막도 메소드는 공개해서 외부에서 메소드를 통해 필드에 접근하도록 유도합니다. 필드의 값을 외부로 리턴해주는 메소드를 Getter라고 하고 외부에서 값을 받아 필드를 변경하는 메소드를 Setter라고 합니다.

  • 상속 : 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 합니다.

  • 메소드 재정의 : 부모 메소드를 자식 클래스에서 다시 정의하는 것을 말합니다.

  • final 클래스 : final 키워드로 선언된 클래스는 부모 클래스로 사용할 수 없는 final 클래스입니다.

  • final 메소드 : final 키워드로 선언된 메소드는 자식 클래스에서 재정의할 수 없는 final 메소드 입니다.

  • 추상 클래스 : 클래스들의 공통적인 필드와 메소드를 추출해서 선언한 클래스를 말합니다.

  • 추상 메소드 : 추상 클래스에서만 선언할 수 있고, 메소드의 선언부만 있는 메소드를 말합니다. 추상 메소드는 자식 클래스에서 재정의되어 실행 내용을 결정해야 합니다.

  • 다형성 : 상속은 같은 종류의 하위 클래스를 만드는 기술이고, 인터페이스는 사용 방법이 동일한 클래스를 만드는 기술이라는 개념상의 차이는 있지만 둘 다 다형성을 구현하는 방법은 비슷합니다. 모두 재정의와 타입 변환 기능을 제공하기 때문입니다.

  • 익명 자식 객체 : 자식 클래스가 재사용 되지 않고 오르지 특정 위치에서 사용할 경우라면 자식 클래스를 명시적으로 선언하는 것은 귀찮은 작업이 됩니다. 이 경우에는 익명 자식 객체를 생성해서 사용하는 것이 좋은 방법 입니다.

  • 익명 구현 객체 : 구현 클래스가 재사용되지 않고 오르지 특정 위치에서 사용할 경우라면 구현 클래스를 명시적으로 선언하는 것은 귀찮은 작업이 됩니다. 이 경우에는 익명 구현 객체를 생성해서 사용하는 것이 좋은 방법 입니다.








혼공 용어 노트에 용어 추가 등의 노트 활용 



10장

기본미션 혼공 용어 노트

  • 예외 exception [10장 444쪽] : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류

  • 예외 처리 exception handling [10장 444쪽] :  일반적으로 프로그램이 처리되는 동안 특정한 문제가 일어났을 때 처리를 중단하고 다른 처리를 하는 것, 자바에서는 예외라고 부르는 오류를 처리하는 과정을 말하기도 한다

    • 일반 예외 : 컴파일러 체크 예외라고도한다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생한다. 일반 예외는 Exception을 상속받지만 Runtime Exception은 상속받지 않는다.

    • 실행 예외 : 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다. 실행 예외는 RuntimeException을 상속받는 클래스들이다.

 

11장

기본미션 혼공 용어 노트

  • API Application Programming Interface [11장 467쪽] : 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음. 라이브러리라고도 부른다.

8. 박싱된 Integer 객체를 == 연산자로 비교했습니다. 100을 박싱한 Integer 객체는 true가 나오는데, 300을 박싱한 Integer 객체는 false가 나오는 이유를 설명해 보세요.

Integer 객체가 처리 할수 있는 값의 범위는 -128~127까지 입니다. obj1,2는 Integer 값의 범위 안에 있어서 정상 적인 결과가 나오는데 obj3,4는 처리 할수 있는 범위가 벗어나서 false가 나오는 겁니다. 300값을 처리 할수 있는 int 객체로 캐스팅 정상적인 결과가 나옵니다.

 

 

수정한 결과

 

550쪽 [직접 해보는 손코딩] 코딩 과정 및 실행 결과 

1초 주기로 save()메소드를 호출하는 데몬 스레드

 

메인스레드가 실행하는 코드

 

*책의 실행 결과는 (책의 실행결과 잘못 된듯 책처럼 나오려면 sleep를 3000->4000으로변경해야함)

작업 내용을 저장함.

작업 내용을 저장함.

작업 내용을 저장함.

메인 스레드 종료

 

  • 프로세스 : 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션이 실행되는데, 이것을 프로세스라고 합니다.

  • 멀티 스레드 : 하나의 프로세스 내에 동시 실행을 하는 스레드들이 2개 이상인 경우를 말합니다.

  • 메인 스레드 : 자바의 모든 애플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작합니다. 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고,  main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료됩니다.

  • 작업 스레드 : 메인 작업 이외에 병렬 작업의 수만큼 생성하는 스레드를 말합니다. 작업 스레드도 객체로 생성되기 때문에 클래스가 필요합니다. Thread 클래스를 직접 객체화해서 생성할 수도 있고, Thread 클래스를 상속해서 하위 클래스를 만들어 생성할 수도 있습니다.

  • 동기화 메소드 : 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역 이라고 합니다. 자바는 임계 영역을 지정하기 위해 동기화 메소드를 제공합니다. 스레드가 객체 내부의 동기화 메소드를 실행하면 즉시 객체에 잠금을 걸어 다른 스레드가 동기화 메소드를 실행하지 못하도록 합니다.

  • 스레드 상태 : 스레드를 생성하고 시작하면 스레드는 다양한 상태를 가지게 됩니다. 스레드의 상태는 자동으로 변경될 수도 있고, 코드에 의해서 변경될 수도 있습니다.

  • 일시 정지 : 실행 중인 스레드를 일정 시간 멈추게 하고 싶다면 Thread 클래스의 정적 메소드인 sleep()을 사용하면 됩니다. 다음과 같이 Thread.sleep()메소드를 호출한 스레드는 주어진 시간 동안 일시 정지 상태가 되고, 다시 실행 대기 상태로 돌아갑니다.

  • 안전한 종료 : Thread는 스레드를 즉시 종료하기 위해서 stop() 메소드를 제공하고 있는데, 이 메소드는 deprecated되었습니다. 그 이유는 stop() 메소드 스레드를 갑자기 종료하게 되면 스레드가 사용중이던 자원들이 불안전한 상태로 남겨지기 때문입니다. 스레드를 안전하게 종료하기 위해서 stop 플래그를 이용하거나 interrupt()메소드를 이용하는 방법이 있습니다.

  • 데몬 스레드 : 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드입니다. 주 스레드가 종료되면 데몬 스레드는 강제적으로 장동 종료되는데, 주 스레드의 보조 역할을 수행하므로 주 스레드가 종료되면 데몬 스레드의 존재 의미가 사라지기 때문입니다.

539쪽 2번 문제 풀이

직접 정리한 키워드 정리 공유

  • 컬렉션 프레임워크 : 널리 알려져 있는 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제 검색할 수 있도록 인터페이스와 구현 클래스들을 java.util. 패키지에서 제공합니다. 이들을 총칭해서 컬렉션 프레임워크라고 부릅니다.

  • List 컬렉션 : List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리합니다. 배열과의 차이점은 저장 용량이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여된다는 것입니다. 그리고, 추가, 삭제, 검색을 위한 다양한 메소드가 제공됩니다. List컬렉션은 동일한 객체를 중복 저장할 수 있고 null도 저장이 가능합니다.

  • Set 컬렉션 : Set 컬렉션은 저장 순서가 유지되지 않습니다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있습니다. Set 컬렉션은 수학의 집합과 비슷합니다. 집합은 순서와 상관없고 중복이 허용되지 않기 때문입니다.

  • Map 컬렉션 : Map컬렉션은 키와 값으로 구성된 Map.Entry 객체를 저장하는 구조를 가지고 있습니다. Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스입니다. 여기서 키와 값은 모두 객체입니다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있습니다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체됩니다.

  • Stack : 후입선출을 구현한 클래스입니다.

  • Queue : 선입선출에 필요한 메소드를 정의한 인터페이스입니다. 구현 클래스로는 LinkedList가 있습니다.

573쪽 [직접 해보는 손코딩] 코딩 과정 및 실행 결과 

입출력 스트림 요약 정리 포스팅

  • 입출력 스트림 : 자바에서 데이터는 스트림을 통해 입출력됩니다. 프로그램이 출발지냐 또는 도착지냐에 따라서 사용하는 스트림의 종류가 결정됩니다. 프로그래밍 도착지이면 흘러온 데이터를 입력받아야 하므로 입력 스트림을 사용합니다. 반대로 프로그램이 출발지면 데이터를 출력해야 하므로 출력 스트림을 사용합니다.

  • InputStream : 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스입니다. 모든 바이트 기반 입력 스트림은 InputStream 클래스를 상속받아서 만들어집니다. InputStream 클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야 할 메소드가 정의되어 있습니다.

  • OutputStream : 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스입니다. OutputStream클래스에는 모든 바이트 기반 출력 스트림이 기본적으로 가져야 할 메소드가 정의되어 있습니다.

  • Reader : 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스입니다. 모든 문자 기반 입력 스트림은 Reader 클래스를 상속받아서 만들어집니다. Reader 클래스에는 문자 기반 입력 스트림이 기본적으로 가져야 할 메소드가 정의되어 있습니다.

  • Writer : 문자 기반 출력 스트림의 최상위 클래스로 추상 클래스입니다. 모든 문자 기반 출력 스트림 클래스는 Writer 클래스를 상속받아서 만들어집니다. Writer 클래스는 모든 문자 기반 출력 스트림이 기본적으로 가져야 할 메소드가 정의되어 있습니다.

  • 보조 스트림 :다름 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림을 말합니다. 보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Reader, Writer등에 연결해서 입출력을 수행합니다. 보조 스트림은 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등의 기능을 제공합니다.

  • 문자 변환 : 소스 스트림이 바이트 기반 스트림 이면서 입출력 데이터가 문자라면 Reader와 Writer로 변환해서 사용하는 것을 고려할 수 있습니다. 그 이유는 문자 입출력은 Reader와 Writer가 편하기 때문입니다. OutputStreamWriter는 Writer로 변환하는 보조 스트림이고, InputStreamReader는 Reader로 변환하는 보조 스트림입니다.

  • 성능 향상 : 기본적으로 출력 스트림은 내부에 작은 버퍼를 가지고 있습니다. 하지만 이것만 으로는  불충분합니다. 보조 스트림 중에는 메모리 버퍼를 추가로 제공하여 프로그램의 실행 성능을 향상시키는 것들이 있습니다. 바이트 기반 스트림에서는 BufferedInputStream, BufferedOutputStream이 있고 문자 기반 스트림에는 BufferedReader, BufferedWriter가 있습니다.

  • 기본 타입 입출력 : DataInputStream과 DataOutputStream 보조 스트림을 연결하면 기본 타입인 boolean, char, short, int, long, float, double을 입출력할 수 있습니다.

  • 개행 출력 : PrintStream/PrintWriter의 println()메소드는 출력할 데이터 끝에 개행 문자인 ‘\n’을 추가합니다. 그래서 출력 시 콘솔이나 파일에서 줄 바꿈이 일어납니다.

  • System.in : 자바는 콘솔에서 키보드의 데이터를 입력받을 수 있도록 System 클래스의 in 정적 필드를 제공합니다. System.in은 InputStream 타입의 필드입니다. 주로 InputStreamReader 보조 스트림과 BufferedReader 보조 스트림을 연결해서 사용하거나, scanner를 이용해서 입력된 문자열을 읽습니다.

  • System.out : 콘솔에서 키보드로 입력된 데이터를 System.in으로 읽었다면, 반대로 콘솔에서 모니터로 데이터를 출력하기 위해서는 System 클래스의 out 정적 필드를 사용합니다. System.out은 PrintStream 타입의 필드입니다. 따라서 PrintStream이 제공하는 print(),println(),printf()와 같은 메소드를 이용해서 모니터로 출력할 수 있습니다.

  • Scanner : Scanner클래스는 입출력 스트림도 아니고, 보조 스트림도 아닙니다. Scanner는 문자 파일이나, 바이트 기반 입출력 스트림에서 라인 단위 문자열을 쉽게 읽도록 하기 위해 java.util 패키지에서 제공하는 클래스입니다.

  • File : java.io 패키지에서 제공하는 File클래스는 파일 및 폴더 정보를 제공해주는 역할을 합니다.

632쪽 2번 문제 풀이

실행결과

 

+ Recent posts