생활코딩 JAVA1 (3)자바 문서 보는 법
=====================
13-1 자바문서 보는 법 - API vs UI
컴퓨터를 하려면 컴퓨터가 있어야하지만
직접다루는 것은 어렵기 때문에 운영체제를 깜(윈도우즈, 맥OS, 리눅스)
여기에 JAVA를 깔아서 내 프로그램을 만들 수 있게됨. - 무턱대고 만들 수 있는게 아니라 자바는 우리 같은 사람들이 프로그램을 쉽게 만들 수 있도록 여러 가지 부품들을 제공함.
▽요런게 자바가 제공하는 부품이었구나, write()는 좀 다른건가봐
화면에 뭔가를 출력하고 싶을 때는 : Systrem.out.println을 썼고
날짜를 알고 싶을 때는 Date, 수학적인걸 사용하고 싶을땐 Math클래스를 사용.
이런 자바가 기본적으로 내장하고 있는 기능들을 기본 라이브러리라고 부르고
우리는 이 부품을 이용해서 내 프로그램을 만듦.
내 프로그램을 만들 때는 자바가 기본적으로 자바가 제공하는 기본적인 문법을 통해
시간에 순서에 따라서
기본 제공하는 라이브러리를 실행되도록 하는걸 통해서 프로그램을 만드는 것.
자바가 기본적으로 제공하는 저 부품들의
‘조작방법’
‘조작장치들’을
A애플리케이션 P프로그래밍 I인터페이스 라고 부름.
시간의 순서에 따라서 실행된다는 시간이 강조된 표현 : Programming
자바가 제공하는 부품들을 ‘응용‘에 방점이 찍혀있는 말 : Application
https://dev-dain.tistory.com/50
봐도봐도 모르겠는 API 개념 설명 (Application Programming Interface)
컴퓨터과학의 개념들은 가끔 나를 매우 헷갈리고 괴롭게 만든다. 특히 나는 개념이 잘 잡혀있지 않거나 어디에 쓰는 건지 그 사용처를 모르면 굉장히 혼란스러워하고 헤매는 사람이라 올바른
dev-dain.tistory.com
인터페이스 : 소통을 하는데 도움을 주는 매개체
API :
Application Programming입장에서 소통을 하는데 도움을 주는 매개체.
어떤 기능의 조작 장치
사용법과 규격이 있어.
alert()함수도 API야.
저 페이지 맨밑 요약에 개발자가 프로그램을 만드는 데 필요한 어떤 기능을 직접 구현하지 않고 API제공자들이 제공하는 데이터와 모듈 등을 갖다쓸 수 있게 해주는 게 API와 API 문서
이렇게 우리가 만든 프로그램이 사람에게 사용된다면
사람이 우리가 만든 프로그램을 조작하기 위해서 조작해야되는 조작장치들이 있겠죠
(웹이면 링크, 데스크탑 애플리케이션이면 버튼, 커맨드라인 시스템이면 Argument)
그것들을 User Interface라고 해서 UI라고 함.
동시에 우리가 만든 프로그램은 사람이 사용하지 않을 수 있다
= 우리가 만든 프로그램을 부품으로 하는 또다른 프로그램이 있을 수 있다.
우리의 프로그램을 사용하는 완제품에 해당하는 프로그램에게 API를 제공해야겠죠.
그것이 또 다른프로그램에게 또 다른 프로그램에게 면 또 API를 제공
이번시간부턴 자바가 제공하는 기본 라이브러리를 사용하는 방법, 즉 API의 사용방법을 스스로 알아내는 방법
==============
13-2 자바문서 보는 법 - 패키지, 클래스, 변수, 메소드
자바의 공식 사용설명서 : 자립의 핵심적 기술
api documentation java n(버전) 검색
자바가 기본적으로 제공하는 부품들 = 라이브러리 에 대한 설명을 볼 수 있다.
클래스 : 하나의 프로그램이다 라고 생각하면 될 것 같아요
수학에 관해 갖다 쓰고 싶으면 클래스에서 Math검색해서 누르면 오른쪽화면에 상세한 정보가 적혀 있음.
근데 Math위에 java.lang은 뭐야? : Math라는 클래스가 소속돼 있는 패키지.
기본제공 클래스가 4천개 정도 되는데 정리정돈 돼 있지 않고 흩어져 있으면 우리가 필요한 것을 찾는게 어렵다
또 이미 Math라는 이름의 클래스가 있는데
내가 Math라는 이름의 내 클래스를 만들고 싶으면
똑같은 이름이 같은 공간안에 있으면 충돌하기 때문에 이런문제를 해결하기 위한 정리정돈의 도구
= 패키지, 비슷한 성격의 클래스를 모아서 이름을 붙인 것.
▽->내가만든것도 패키지고 클래스구나
클래스는 뭐야! 서로 연관된 변수와, 메소드라는 것을 모아서 이름을 붙인 것.
여러 개의 클래스가 있으면 정신없겠죠 그걸 그루핑한게 패키지
그리고 그 클래스들은 관련있는 변수와 메소드를 그루핑한 것.
=====================
13-3 자바문서 보는 법 - 클래스
Math.PI : 파이의 구체적인 값이 적당한 정밀도로 저장 돼 있는 변수
Math. 점을 찍으면 자바가 도움줄려고 이미 있는 수학관련 변수나 메소드의 리스트를 보여줌.
Math.PI : PI가 Math라는 클래스에 소속돼 있다. 클래스의 인상 중 하나, 클래스는 디렉토리다.
파일이 1억갠데 디렉토리가 없으면 난장판.
Math.floor(1.6) 이만큼이 그대로 1.0이 되는 것.
∴ 클래스는 서로 연관된 변수와 메소드를 모아서 이름을 붙인 것.
=====================
13-4 자바문서 보는 법 - 인스턴스
[1]
자바로 result1.txt라는 파일에 hello1이라는 텍스트를 자바를 이용해 작성할 것.
앞으로
(1)검색을 통해 어떤 클래스가 필요한지 알아내고
(2)예제를 찾아내서 본 다음
(3)그래도 이해가 안가는게 있을 때 API 다큐멘테이션 같은것들을 분석, 오랜 시간에 걸쳐서 그 사용법을 알아내야 함.
PrintWriter는 Math와 다르게(얘는 그냥 Math.하고 쓰면 됐는데) --▽아마 스태틱이라서
1.PrintWriter(“여기에 저장하고 싶은 파일의 이름을 적고”)
2.앞에 new를 붙여서 아바타, 복제본을 만들고 new PrintWriter(“”) --이게 복제본만드는거였구나
3.p1 = new PrintWriter(“”) : 그 복제본을 p1이라는 변수에 담고
*이때 저 변수에 담겨있는 어떤 무엇을 PrintWriter라는 클래스의 인스턴스 라고 함.
p1에 아무거나 들어가면 안되기 때문에
p1에는 반드시 PrintWriter의 인스턴스만 들어간다는 뜻에서
데이터 타입으로 PrintWriter를 지정
: PrintWriter p1 = new PrintWriter(“”)
이러면 빨간줄이 그임.
Math는 특별한 조치를 하지 않아도 사용 가능
PrintWriter는 자바에 내장돼 있긴 한데 어떤 특별한 작업을 해야함 : 패키지를 가져오는 작업.
import java.io.PrintWriter; : 이 파일 내에서 PrintWriter라는 이름의 클래스는 java.io에 소속돼 있는 것이다!
▽
new 안해도 되는 건 static
import는 안해도 되는건 java의 lang패키지
JAVA의 lang 패키지는 JAVA 프로그래밍에 필요한 가장 기본적인 클래스들이 모여있는 패키지라서 다른 패키지들과는 달리 import구문 없이도 자동으로 프로그램에 포함된다.
java.lang이지만 스태틱 아닌 것은 new해야하고
static이지만 java.lang이 아닌 것은 import해야겠군
그래도 빨간줄, 우리가 파일을 읽다보면 파일이 없으면 문제가 될 수 있음. 자바에선 그런걸 예외사항이라고 얘기하는데 그런 예외를 어떻게 처리해야 될지를 우리가 정해야함. 지금은 너무 어려워서 예외를 알아야하는 심각한 소프트웨어를 만들기 전까지는 Add throws declaration(선언)클릭 하고 IOException으로 선택
p1이란 인스턴스에서 write를 해서 : p1.write(“Hello 1“);
p1에 대한 작업을 끝냈으면 p1.close();해서 파일을 더 이상 붙잡고 있지 않도록 해서 남도 수정할 수 있도록 함.
그 다음 그대로 복사해서
PrintWriter p2 = new PrintWriter(“result2.txt”);
p2.write(“Hello 2”);
p2.close();
->실행하면 result1, 2가 생김.
그래서 인스턴스가 뭐냐??
Math는 그냥 클래스에다가 변수를 썼고(PI) 클래스에다가 메소드를 썼다.
PrintWriter는 그냥 쓰지 않고 new를 붙임. 그리고 복제(new 한 거)한 결과를 p1에 담음.
왜 굳이 이렇게 해?
->만약에 인스턴스를 쓰지 않는다면 어떤 불편함이 있을까?
PrintWriter p2 = new PrintWriter(“result2.txt”);
p2.write(“Hello 2”);
p2.close();
와
PrintWriter.write(“result2.txt”, “Hello 2”); 과 똑 같은 역할을 한다고 상상, 믿어주세요.(실제로 그렇진 않지만)
PrintWriter.write(“result1.txt”, “Hello 1”);
PrintWriter.write(“result2.txt”, “Hello 2”);…. 엄청나게 많이 이뤄진다고 한다면 우리눈에 엄청나게 거슬리는게 있다
라이트를 할 때마다 내가 어떤 파일을 수정할지를 지정하고 있다.
인스턴스를 사용했을 땐 result1에다가 내용을 기록하고 싶다 하면 그냥 p1.write(“Hello 1”);하면 된다.
클래스에다가 직접 라이트를 하는 방식은 라이트를 할 때마다 내가 어떤 파일을 수정할건지 그때그때 입력
▽p1에 result1.txt라는 정보가 있으니까. -> 인스턴스를 만들면 거기에 내가 세팅을 해놓을 수가 있구나
왜 이렇게 되는거야?? 인스턴스를 안쓸 땐 PrintWriter라고 하는 하나의 클래스를 write라는 애가 돌려막기. 돌려쓰고 있음.
new를 통해서 인스턴스를 만든 건 내부적으로 각자의 상태를 갖고 있다.
p1은 result1.txt p2는 result2.txt라는 내부적인 상태를 내장하고 있기 때문에
p1.write하게되면 result1에 대한 것. p2…마찬가지
그래서 Math.PI같은건 1회용 같은 작업들임. 짧은 맥락의 작업들. 그 값이 필요하다. 값을 바꾼다. 같은
근데 파일을 수정한다는 것은 그 파일 하나만 수정하는 것이 아니라 그 파일에 대한 여러 가지 작업들이 후속으로 주루룩 들어오게 되고 그리고 동시에 여러 개의 파일을 작업하게 될 수도 있음. 그런 경우엔 하나의 클래스를 사용하는 것보단 하나의 클래스를 new를 붙여서 복제해서 각각의 다른 상태를 갖고 있는 인스턴스를 만들어서 걔를 사용하는 것이 더 효율적일 수 있다라는 것.
▽->상태를 보존하는거구나, 이렇게 왜 하는지 알아야 실전에서 써먹지.
그래서 클래스를 만드는 사람들은 그 클래스가 인스턴스가 필요없이 1회용으로 쓸 수 있다 이러면 Math.ceil(ex.Math.ceil(값) // 인스턴스로 만들었다면 m.ceil(값)이겠지)처럼 만드는거고 클래스가 하는 작업이 긴맥락의 작업을 꼬리의 꼬리를 물면서 해야된다 그럴땐 클래스를 복제한 인스턴스를 만들어서 그것을 사용할 수 있도록 사용자에게 제공하는 것이 더 효율적이기 때문에 그에 맞춰서 코드를 제작하게 됨.
어떤 차이가 있는가 매뉴얼을 살펴보면 PrintWriter는 Constructor라고 하는 것이 있음(생성자)
Math는 생성자가 없음. 생성자가 없는 애들은 1회용이라고 일단 생각하세요~Math나 System같은
생성자, 세터 = 세팅 = 초기화 // Math같은건 계산만 해주는거니까 세팅이 필요가 없겠지
컨스트럭터가 있다는 것은 이걸 이용해서 인스턴스를 만드는 것이 허용돼 있다 라고 생각하시면 됩니다.
컨스트럭터 PrintWriter(String fileName)은 문자열로된 파일이름을 괄호안에 넣으면 되는거고, 어떻게 쓰는지는 클릭해보면 나옴. 클릭하면
->설명
+입력값으로 들어오는 값은 어떤게 돼야는 Parameters
+저 클래스를 사용하는 과정에서 생길 수 있는 오류는 어떤것인지 나와있음 FileNotFoundException은 파일을 찾을 수 없을 때 생기는 예외가 발생할 수 있다 라는 것을 알려줌
∴ 클래스를 만든 사람은 클래스 사용자가 인스턴스로서 활용하기를 원한다면 컨스트럭터라는 걸 갖게 한다.
new 뒤가 컨스트럭터이고 컨스트럭터 앞에 new를 붙이면 걔가 복제돼서 인스턴스가 되고 그 인스턴스에 어떤 값이 올수 있느냐를 규제하기 위해 앞에다가 PrintWriter라고 하는 클래스 이름을 적는다.
생코 : 저는 이거 이해하는데 1년 걸렸어요, 너무 이해하려고 하지 말고 눈치껏 하세요 ㅋㅋ남들이 짠 코드 눈치껏 바꿔가면서 하다보면 어느순간에 이해도 하기 전에 익숙해져서 사용할 수 있게 될 겁니다. 우리 양자역학 몰라도 눈치껏 잘 살아왔잖아요
네이버 : 인스턴스는 클래스를 컴퓨터 상에서 실체화(▽클래스가 설계도니까?)한 것. 왜 필요?
네이버 says : 인스턴스는 객체를 다양한 상태(▽세팅)에서 사용하고, 기능을 재사용할 경우가 많은 상황(▽반복하니까)에서 유용한 방식입니다.
▽일단 java.lang말고 다른 패키지에 있어서 import하는것은 new랑은 관련이 없다.
▽그리고 상관없는데도 throws IOException도 있어서 버거움을 불러 이해를 어렵게 한다.
->네이버는 왜 Math는 클래스라고 하고 PrintWriter는 객체라고 할까 인스턴스를 생성해서 사용하는걸 객체라고 하나 -> 검색해보면 :
(1)
클래스는 설계도, 틀
객체는 클래스에 ‘선언’((▽선언은 맨 처음에 이건 이렇게 생겼다 하면서 만드는 것. 정의하는 것)된 모양 그대로 생성된 실체,
클래스의 인스턴스
/ 인스턴스는 구현된 구체적인 실체, 객체를 소프트웨어에 실체화 하면 그걸 인스턴스 라고 부른다. 인스턴스는 객체에 포함된다고 볼 수 있다. 객체는 클래스의 인스턴스다.
(2)
클래스는 차 모양, 객체는 벤츠, bmw, Audi
(3)
추상화 기법의 하나로 분류/인스턴스화(classification/instantiation)라는 개념이 있습니다.
분류는 실재하는 객체들을 공통적인 속성을 공유하는 범주 또는 추상적인 개념으로 묶는 것을 의미합니다.
인스턴스화는 분류의 반대 개념으로 범주나 개념으로부터 실재하는 객체를 만드는 과정을 의미합니다. 인스턴스화는 예시(exemplification)라고도 부르죠.
결론적으로 인스턴스라는 말은 추상적인 개념(또는 명세)과 구체적인 객체 사이의 관계에 초점을 맞출 경우에 사용하는 것이 올바른 용법입니다.
예를 들면: * 객체는 클래스의 인스턴스다. * 객체 간의 링크는 클래스 간의 연관관계의 인스턴스다. * 실행 프로세스는 프로그램의 인스턴스다.
위 예에서 알 수 있는 것처럼 추상적인 개념(또는 명세)과 구체적이고 실재적인 것사이의 관계에 초점을 맞추는 경우 "~의 인스턴스"라는 형식으로 사용하게 되죠.
따라서 인스턴스라는 용어를 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없습니다.
원칙적으로는 "인스턴스"라는 단어만 단독으로 사용하는 것은 문제의 소지가 있지만 문맥상으로 그 의미를 유추할 수 있을 경우 인스턴스라는 말이 클래스의 인스턴스인 객체를 지칭하는 말로 많이 사용되는 것 같습니다.
정확한 용법 보다는 의미 전달이 중요하겠죠. ^^ - https://www.slipp.net/questions/126
=====================
13-5 자바문서 보는 법 - 상속
네이버 : 분권이 되어있는 책들처럼, 각각의 책들은 다르지만 원래의 큰 책이기도 한 계층적인 구조.
클래스 사이에도 계층적인 관계가 존재.
설명서에 보면(▽)
java.io.Writer
java.io.PrintWriter
: PrintWriter라는 클래스는 Writer라는 클래스를 상속받았다
java.lang.Object
java.io.Writer
: 얘는 또 얘를 상속 받았다.
▽패키지랑은 상관없군.
부모고 자식이란건데 뭔말이냐면 우리가 어떤 기능을 만들 때 처음부터 끝까지 다만드는건 좀 어려움.
PrintWriter라는 클래스를 만든 사람이 처음부터 끝까지 다 만들기 싫은 것. 이미 있는 Writer라는 클래스가 갖고 있는 메소드 변수를 그대로 물려 받으면서 거기에 자기가 원하는 메소드, 변수를 추가한 것이 PrintWriter인 것.
마찬가지로 Writer라는 클래스를 만든 사람은 Object라는 클래스를 상속받아서 자기가 원하는 변수와 메소드를 추가한 것.
이클립스에서 코드에 써진 클래스를 우클릭하면 Open Type Hierarchy를 누르면 그 클래스의 상속관계를 보여줌.
자바에서는 변수를 필드라고 하죠~
Object에 toString이라고 있지만 Writer와 PrintWriter에는 구현한 적이 없는데 그럼에도 상속받았기 때문에 우리가 PrintWriter에서도 p2.toString이라는 메소드를 사용할 수가 있다.
▽자식에서 부모 기능을 다 쓸 수 있다.
자바의 가장 기본적인 클래스는 Object클래스. 모든 클래스는 Object클래스를 상속받음.
Writer extends Object : 오브젝트를 익스텐즈해서 Writer라는 클래스를 만듦, 그때 쓰는 키워드가 extends
PrintWriter p1 = new PrintWriter(“result 1”);
p1.toString()
이라고 하면
1.일단 PrintWriter클래스에 toString메소드가 있는지 찾아보고 --얘가 제일 먼저네
2.없으면 extends가 가르키는 Writer에서 찾음
3.없으면 extends가 가르키는 Object에서 찾아봄
다른 관점에서 보면 Writer에도 write가 있고 PrintWriter에도 있는데 PrintWriter를 만든 사람이 저 위에 있는게 마음에 안들어서 덮어쓰기(override)로 새로 만든것임. 그때 쓰면 PrintWriter에 있는 write를 쓰게됨.
매뉴얼에서 Tree를 누르면 자바가 제공하는 표준 라이브러리의 클래스들이 서로간에 어떤 상속관계를 맺고있는지 보여줌. 정점엔 당연히 Object. 어디서든 쓰일 수 있으니 나중에 Object가 갖고 있는 메소드 들은 의미 쓰임을 알아보는게 좋겠지
매뉴얼에서 클래스를 누르면 Direct Known Subclasses: 는 그 클래스를 상속받은 것중에 알려진 것들로는 이런것들이 있다. 왜 Known(알려진)이라는 표현을 쓰냐? 제 생각에는 표준라이브러리가 아니라 여러분들도 Writer라는 클래스를 상속받아서 여러분의 클래스를 만들 수 있거든요 그래서 그런것들은 공식사용설명서에는 없으니까 Known이라는 표현을 쓰는 것이 아닌가