TIL-Java(자바 문서보는법)

연시아·2022년 7월 21일
0

TIL

목록 보기
47/51
post-thumbnail

22.07.21

📔 API vs UI

컴퓨터를 사용하려고 하는데 컴퓨터를 직접 다루기 어렵기 때문에 컴퓨터에 운영체제(Window,MacOs ...)를 설치합니다. 그리고 운영체제에 맞는 java 프로그램을 설치하고, 자바를 이용해서 나의 프로그램을 만들 수 있게 됩니다. 자바는 프로그램을 쉽게 만들 수 있도록 여러 가지 부품들을 제공합니다.(화면에 출력-System.out.println, 날짜-Date, 수학-Math ...) 자바가 기본적으로 내장하고 있는 기능들을 "기본 라이브러리" 라고 하고, 이 라이브러리라고 하는 부품을 이용해서 Java Program을 만듭니다. 시간의 흐름에 따라서 자바가 제공하는 기본적인 문법애 따라서 라이브러리가 실행되도록 하여 프로그램을 만듭니다.

API(Appilcation Programming Interface)

  • 자바가 기본적으로 제공하는 라이브러리 조작 방법
  • Programming : 시간의 순서에 따라서 실행
  • Application : 자바가 제공하는 부품들을 응용해서 만듬
    UI(User Interface)
  • 사람이 우리가 만든 프로그램을 조작하기 위해서 조작해야 되는 조작 장치
  • ex) 웹-link, 데스크탑 애플리케이션-버튼, command line system-argument

    우리가 만든 프로그램을 사람이 사용하지 않을 수도 있습니다. "우리가 만든 프로그램을 부품으로"하는 다른 프로그램을 만들 수 있습니다. 완제품에 해당되는 프로그램에게 우리의 프로그램에게 API를 제공해야 됩니다.

    API Documentation - 패키지, 클래스, 변수, 메소드
    "자립"의 핵심적인 기술 - 자바의 공식 라이브러리 설명서 보는 방법
    https://docs.oracle.com/javase/7/docs/api/

패키지 -> 서로 연관된 비슷한 성격의 클래스를 그룹핑
클래스 -> "하나의 프로그램" 서로 연관된 변수와 메소드를 그룹핑

수학과 관련된 작업을 해야 할 때 사용할 수 있는 클래스를 검색 - (페이지 검색 : ctrl + F) 'Math' 검색 -> Class 목록에서 검색된 'Math'를 클릭하면 우측에 클래스에 대한 상세보기가 나옵니다.
"java.lang":Math 클래스가 소속되어 있는 패키지

📕 Class

클래스는 서로 연관된 변수와 메소드를 그룹핑하여 이름을 붙인 것을 말합니다.

클래스 사용법
1. 특정한 정보를 알아내고 싶고, 파이값을 알고 싶으면 ?
자바는 수학관 관련된 'Math' 클래스를 내장하고 있습니다.
클래스명을 입력 후, 점(.)을 찍으면 해당 클래스에 소속되어 있는 변수와 메소드 리스트를 보여줍니다.

Math.PI는 파이값이 적당한 정밀도로 저장되어 있는 변수입니다. 이러한 PI는 Math 클래스에 소속되어 있습니다. 클래스를 "디렉토리" 개념으로 볼 수 있습니다.
2 어떤 정보를 처리하고 싶습니다.
실수의 소수점 자리를 올리고 내리고 싶다면 ?
Math.ceil 메소드는 천장이란 의미로 입력값을 올림하는 기능입니다.
Math.floor 메소드는 바닥이란 의미로 입력값을 내림하는 기능입니다.

📗 인스턴스

'PrintWriter' 라는 클래스를 이용해보자.
PrintWriter(생성할 파일명) ()안에 생성할 파일명을 적고, new키워드를 통해 'PrintWriter의 복제본(아바타)'를 만들어서 p1 이라는 변수에 담습니다. "p1에는 반드시 PrintWriter라는 클래스의 인스턴스만 들어간다"는 뜻에서 데이터타입으로 PrintWriter를 지정해줍니다.
즉, 이 변수에 담긴 것을 PrintWriter라는 클래스의 인스턴스입니다.

PrintWriter를 사용하려면 import하여 패키지를 가져와야 합니다. (PrintWriter는 java.io라는 패키지에 소속되어 있습니다.)

※ 예외처리
파일을 처리하려는데 파일이 없는 상황과 같이 문제가 되는 경우를 "예외 상황"이라고 합니다. 그러한 예외를 어떻게 처리할지에 대해서 정의해 줘야 합니다. 마우스를 갖다대서 [Add Throws declaration]을 선택합니다.

[IoException - java.io] 선택합니다.

p1 인스턴스에 write()메소드를 이용해 저장할 내용을 입력 후, p1에 대한 작업을 마쳤으면 close()를 통해서 더 이상 파일을 붙잡고 있지 않도록 처리하여, 다른 사람도 수정할 수 있도록 합니다.

실행 후, 프로젝트 우클릭해서 Refresh 하면, result1.txt와 result2.txt 파일이 생성된 것을 확인할 수 있습니다.

그렇다면 인스턴스는 무엇인가 ?
다음의 Math 클래스는 그냥 클래스에 변수 이름을 썼고, 클래스에 메소드를 썼습니다.

하지만, printWriter 클래스는 그냥 쓰지 않고, new를 통해서 복제한 결과를 변수에 담아서 사용했습니다.

❓ 만약 인스턴스를 쓰지 않는다면 어떻게 될까 ❓
인스턴스를 쓰지 않고 그냥 사용한 (위 3줄의 코드와 동일하게 동작하는) 코드가 다음과 같다고 생각해보자. (실제론 동작하지 않습니다.)

그리고 이러한 작업이 일회성이 아니라 엄청나게 많이 이루어진다고 하면 ?

write를 할 때마다 내가 어떤 파일을 수정할 것인지 그때그때마다 지정하고 있습니다. 이 printwriter라는 클래스는 write 메소드가 서로 돌려쓰고 있습니다. 이것은 상당히 비효율적입니다. 위에 있는 printwriter는 new를 통해서 인스턴스를 만들었고, 그 인스턴스는 내부적으로 각자의 상태를 가지고 있습니다. (p1은 result1.txt, p2는 result2.txt 라는 내부적인 상태를 내장하고 있습니다.) 인스턴스를 이용한다면 인스턴스명.write("내용");을 통해서 작업을 간편하게 할 수 있습니다. 따라서 Math와 같이 일회성 작업을 하는 클래스들은 그냥 사용하고, 파일을 수정하고 그 파일에 대한 여러가지 작업들이 후속으로 따라오거나 동시에 여러 개의 파일을 작업해야 되는 경우에는(하나의 클래스를 사용하는 것보다는) 클래스를 복제해서 각각의 다른 상태를 가지고 있는 인스턴스를 만들어서 사용하는 것이 효율적입니다.

Math와 printwriter는 어떤 차이점이 있는지 메뉴얼을 살펴보자.
printwriter에는 "Constructor"라는 생성자가 있습니다. Math와 같이 일회성 클래스는 Constructor가 없습니다. 이런 Constructor를 이용해서 인스턴스를 만드는 것이 허용된다고 생각하면 됩니다.
여러 Constructor 목록 중 우리가 사용했던 Constructor는 printwriter(String file Name)입니다.

해당 Constructor를 클릭하면 사용법을 볼 수 있습니다.
입력값으로 어떤 값으로 들어와야하는지, 클래스를 사용하는 과정에서 생길 수 있는 오류는 어떤 것인지(예를 들면 이 클래스의 경우 "FileNotFoundException" - "파일을 찾을 수 없을 때" 생기는 예외가 발생할 수 있다는 것을 알려주고 있습니다.)

📘 상속(Inheritance)

printwriter 클래스의 사용설명서를 살펴보자.
printwriter(자식) 이라는 클래스는 Write(부모)라는 클래스를 상속받았습니다.

java.io.Write를 클릭해서 Write 클래스를 살펴보자.
Write(자식) 클래스는 Object(부모) 라는 클래스를 상속받았습니다.

어떠한 기능을 만들 때 처음부터 끝까지 만드는 것은 어렵습니다. 그래서 printwriter 클래스를 만든 사람이 이미 만들어져 있는 Write 라는 클래스가 갖고 있는 메소드, 변수를 물려받으면서 거기에 자기가 원하는 메소드, 변수를 추가한 것이 printwriter 클래스인 것입니다.
이클립스에서 printwriter가 어떤 상속 관계를 가지고 있는지 살펴볼 수 있는 기능입니다.
매소드명 우클릭 -> [open Type Hierarchy]

선택한 클래스의 상속관계를 보여줍니다. Object --- 상속 ----> Write ---상속---->printwriter
각 클래스에 존재하는 메소드와 변수 목록을 확인할 수 있습니다.

📙 상속받은 메소드 사용

Object에는 아주 중요한 toString() 이라는 메소드가 있습니다. Write 클래스와 printwriter 클래스에는 toString()메소드를 구현한 적 없지만 Object 클래스를 상속받았기 때뮨에, toString()메소드를 사용할 수 있습니다.

class Object
자바의 가장 기본적인 클래스
모든 클래스는 Object 클래스를 반드시 상속받습니다.
class Write extends Object
Write 클래스는 Object 반드시 상속받아야 하기도 하고, Object 기능을 사용하기 위해서 상속받아 Write클래스를 생성하였습니다. "Object를 확장(extends)해서 Write클래스를 만들었다"라는 의미
class printwriter extends Write
Write 클래스를 상속받아 printwriter 클래스를 생성

이런 상속관계에서 printwriter의 인스턴스를 만들고 그 인스턴스에 toString() 하면, toString이 Object에 있는 상황에서 자바는 먼저 printwriter 클래스에 toString 메소가 있는지 확인 후, 없으면 Write 클래스를 확인합니다. 그리고 없으면 extends가 가리키는 Object 메소드를 확인해서 Object에 구현되어 있는 toString 메소드를 사용하게 됩니다. (없다면 에러발생)

📒 상속받은 메소드 재정의 - override

Write 클래스에는 Write(String) 입력값으로 String 값을 받는 메소드가 정의되어 있습니다.
그리고 printwriter 클래스에도 write(String) 입력값으로 String 값을 받는 메소드가 정의되어있습니다. 즉, printwriter 클래스에 write()라는 메소드는 Write 클래스의 Write() 메소드를 덮어쓰기 하여 구현한 것입니다.
p1.write("Hello World"); 라고 하면, 자기가 속해있는 printwriter의 write()메소드를 사용하게 됩니다. 이러한 관계를 "Override 했다" 라고 합니다.

자바 공식 사용설명서에 [tree]에서 상속 관계를 나무모양으로 볼 수 있습니다.
자바가 기본적으로 제공하는 표준 라이브러리의 클래스들이 서로 간의 어떤 상속 관계를 맺고 있는가를 보여줍니다. 그리고 그 최상위에는 Object가 있습니다. 이 Object가 갖고 있는 메소드들은 모든 클래스가 공통적으로 사용할 수 있는 메소드이기 때문에 Object 클래스가 갖고 있는 메소드의 의미와 쓰임을 알아보면 좋습니다.

Write 클래스를 상속받은 자식들 중에 알려진 클래스들의 목록입니다.

lock 이라는 변수가 Write 클래스에 정의되어 있고, 그것을 상속받아서 이 printwriter도 lock이라는 필드를 사용할 수 있습니다.


Object 클래스가 갖고 있는 아래 메소드들을 상속받았기 때문에 사용 가능하다고 알려주고 있습니다.

profile
backend developer

0개의 댓글