코딩공부/Java

4. 자바문서 보는법 (API/UI, 패키지/클래스, 인스턴스, 상속)

FeelsKim 2022. 10. 20. 00:26

1. API와 UI

 

우리가 요리를 하거나 가구같은 것들을 만들때 필요한 모든 재료 하나하나를 직접 만들지 않는 것처럼,

프로그래밍 역시 모든 요소들을 직접 만들 필요가 없다. (효율성의 문제)

IDE에서 다양한 기능들을 지원하기도 하고 언어 자체에도 수많은 기능(라이브러리)들이 내장되어 있어, 프로그램을 만드는 것을 도와주는 것이다. 

 

API(Application Programing Interface)는 '기존에 존재하는 특정 기능들을 응용(Application)하여 시간에 따라 순차적으로 실행하도록 해주는(Programing) 장치'라는 의미를 가지고 있다.

그냥 단순하게 생각하면 프로그램을 만드는 단계(개발단계)에서 활용되는 기능들 정도? 어디까지나 상대적인 개념이다.

즉, API를 통해 만들어진 어떤 프로그램이 다른 프로그램을 만드는데 응용되어 쓰인다면 그것 역시 API라고 할 수 있다.

 

UI(User Interface)는 반대로 만들어진 프로그램을 실제 사용자가 사용하는 과정에서 조작하게 되는 요소들을 말한다. 

예를 들어 네이버에 있는 검색창, 로그인입력, 배너이미지, 각종 메뉴버튼 등이 모두 UI에 해당되는 것이다.   

 

 

2. 자바 API문서 보는법 (패키지 / 클래스 / 필드 / 메소드)

 

https://docs.oracle.com/javase/7/docs/api/

 

Java Platform SE 7

 

docs.oracle.com

 

오라클 홈페이지를 통해 자바 언어에서 기본적으로 사용할 수 있는 API목록이 정리된 문서를 볼 수 있다.

 

Java API문서

클래스(Class)는 특정 작업을 하는 작은 프로그램 정도로 보면된다. (출력, 반올림, 최대값, 최솟값 등등)

패키지(Package)는 비슷한 성격의 클래스들을 묶어놓은 단위로, 상위폴더와 하위폴더의 개념이라고 보면 된다.

 

Math 클래스

위 이미지에서 보이는 Math라는 클래스는 java.lang이라는 패키지에 속해있음을 확인할 수 있다.

 

 

각각의 클래스들은 특정 상태(값)를 나타내는 필드(Field)와 특정 동작을 수행하는 메소드(Method)로 이뤄져 있다.

 

필드는 특정한 값을 정의한 일종의 변수로, 위 이미지에서 E와 PI는 각각 자연로그의 밑(E)과 원주율(π)을 나타낸다. (물론 둘 모두 무리수이기 때문에 일정부분까지만 출력된다.)

메소드는 특정 동작을 수행하는 함수의 개념으로, 자연히 그 대상이 되는 값(인수)들을 입력해야 한다. (절대값, 반올림, 최댓값 등)

 

 

3. 인스턴스 (Instance)

 

인스턴스 개념이 명확히 이해하기가 좀 어려운것 같다. 대충 별도의 변수로 지정하여 특정 클래스를 복사한 것 정도로 이해되는데, 보다 정확한 개념 이해는 아래 블로그를 참조하였다.

 

https://higher77.tistory.com/54 

 

TIL#35 객체, 클래스, 인스턴스 관계정리(매우 중요)

객체(object)라는 개념을 구성하는 2개의 단어는 클래스(Class)와 인스턴스(instance)이다. 클래스는 그룹,분류,교실과 같은 뜻으로 쓰이고 인스턴스는 구체적인 사례, 예제라는 뜻으로 쓴다. 포유류는

higher77.tistory.com

 

읽어보니.. 객체(Object)라는, 소프트웨어 상에서 구현하고자 하는 컨셉(개념)을 클래스라는 설계도를 본따서 만들어진 실체가 인스턴스인 것이라는 정도? (객체 = 클래스+인스턴스)

단순히 개념적으로 접근하면 객체가 가장 원형에 가까운 컨셉이고, 클래스는 거기서 좀 더 구체화된 디자인이며, 인스턴스는 그 디자인을 참고하여 만들어진 실체화된 각각의 개별단위 정도로 이해하면 그나마 이해가 되는것도 같다.

 

사실 이러한 개념이 어디선가 익숙한 느낌이 들었는데, 철학에서의 '이데아(Idea) 개념이랑 비슷한 면이 있다.

나무(tree=木)라는 원형(객체)에는 소나무, 참나무, 대나무 등 매우 다양한 종류의 나무들(클래스)이 있지만, 같은 소나무라고 하더라도 결국 현실에 실존하는 그 소나무들 각각은 별개로 존재하는 실체들(인스턴스)이기 때문에 엄밀히 '같은 나무'라고 할 수 있는가 하는, 존재의 본질에 대한 물음이 있다. 정말 다양한 형태와 종류의 나무들이 실존하지만 우리는 그것들을 모두 '나무'라고 총칭하고 있는 것이다.. (잡소리 끝)

 

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

public class InstanceApp {

	public static void main(String[] args) throws IOException {
		
        // PrintWriter 클래스를 복사하여 p1이라는 인스턴스 생성
		PrintWriter p1 = new PrintWriter("result1.txt");  
		p1.write("hello 1");
		p1.close();
		
        // PrintWriter 클래스를 복사하여 p2라는 인스턴스 생성
		PrintWriter p2 = new PrintWriter("result2.txt");
		p2.write("hello 2");
		p2.close();
		
		
	}

}

 

여튼, 인스턴스를 만드려면 위처럼 특정 클래스 앞에 new를 붙이고 그것을 원하는 이름의 변수로 지정하면 된다. (변수에 클래스와 동일하게 데이터타입 설정 필수!)

일단 인스턴스를 사용하는 이유는 단순 클래스의 경우 매 클래스마다 새롭게 작성해야하기 때문에, 코드가 길어지면 상당히 비효율적이기 때문이다. 일단 인스턴스로 지정해놓으면 해당 인스턴스를 그대로 가져와 사용할 수 가 있다.

 

 

단, 모든 클래스에서 인스턴스를 만들 수 있는 것은 아니다. 생성자(Constructor)가 존재하는 클래스에서만 인스턴스를 생성할 수 있는데, 이 생성자 자체가 인스턴스를 만들 수 있음을 나타낸 것이기 때문이다. 그리고 이 생성자는 API 문서를 통해 확인이 가능하다.

 

 

4. 상속

 

다시 PrintWriter 클래스의 문서페이지를 보면 해당 클래스의 상속관계를 볼 수 있다.

상속(또는 확장, Extend)이란, 자식(하위) 클래스가 부모(상위) 클래스의 필드와 메소드를 그대로 이어받아 똑같이 사용하는 것을 말한다. 위에서 PrintWriter 클래스는 부모 클래스인 Writer 클래스로부터 상속을 받으며, Writer 클래스 역시 그 부모 클래스인 Object 클래스로부터 상속을 받는다.

 

 

특히, Object 클래스는 모든 클래스들이 상속받는 최상위 부모 클래스이기 때문에 Object 클래스의 필드와 메소드를 사용할 수 있으므로, 미리 알아두면 유용할 것으로 보인다.

 

 

이클립스 상에서 원하는 클래스에 우클릭 후 Open Type Hierarchy로 들어가면 해당 클래스의 상속관계를 확인 할 수도 있다.

 

 

'생활코딩' 강의 中

 

클래스들의 상속관계를 도식화하면 위와 같다.

'Writer extends Object' 즉, 'Object 클래스에서 확장된(상속받은) Writer 클래스'라는 의미다. (이하동일)

 

만약 PrintWriter 클래스를 복제한 p1이라는 인스턴스에서 toSring()이라는 메소드를 실행하면 가장 먼저 복제했던 클래스인 PrintWriter에서 해당 메소드가 있는지를 찾게되고, 없으면 그 부모클래스인 Writer 클래스에서, 거기서도 없으면 그 부모클래스인 Object 순으로 찾게되며, 해당 메소드가 있을 때 정상적으로 실행된다. (어디서도 해당 메소드가 없다면 당연히 에러)

 

그런데 부모클래스에 존재하는 메소드가 자식클래스에서도 똑같이 존재하여 서로 중복이 되는 경우도 생기는데, 이 경우는 자식클래스의 메소드가 부모클래스의 메소드를 덮어쓰기(Override)한 것이기 때문에 자식 클래스의 메소드로 실행된다.