생활코딩 Java 수업 정리 노트

2019. 4. 7. 04:06Engineer/Java

반응형

여기에 정리한 내용은 이고잉님의 Java 수업으로 부터 온 것입니다. 

Java 수업 링크 : https://opentutorials.org/module/516

C언어를 어느정도 알고 있는 사람이라면 짧게는 3일정도?? 길게는 일주일 정도면 이고잉님의 Java 수업을 끝낼 수 있을 듯 합니다. 저는 영상 다보는데 4일정도 걸렸네요. 이제 Java 기초를 닦았으니 다시 안드로이드 앱프로그래밍 공부를 해야겠네요. 

 


C언어와 다른점이나 새로운 점 등에 대한 정리


   실수, 정수의 표현


C언어와 다르게, Java에서는 변수에 입력하는 정수나 실수에도 데이터 타입이 있다. 정수의 경우 default로 int형이고, 실수의 경우 double이 default 이다. 아래처럼 실수를 그냥 float 형 변수에 입력하면 에러가 발생한다. 


아래처럼 정수를 long 변수에 입력하면 에러가 발생한다. 하지만 byte와 short 는 기본적으로 int형 정수를 입력할 수 있다.  



   자동 형 변환


명시적 형 병환의 경우는 C언어에도 있는 내용이다. 암시적 형 변환(자동 형 변환)은 아래와 같다.



   문자열 비교


문자와 문자를 비교할 때는 '=='를 사용하지 않고 .equals를 사용



   switch 문을 사용할때 주의할 점


switch 의 조건으로는 몇가지 제한된 데이터 타입만을 사용할 수 있다. byte, short, char, int, enum, String, Character, Byte, Short, Integer



   배열


배열을 선언할때 , 데이터 타입 뒤에 [ ] 를 쓴다. 



   for-each 문




   메소드(method) = 함수(function)


 C언어에서 함수라고 하는 것이 Java에서는 메소드라고 부른다. 



   Java는 객체지향을 강제한다. 객체지향의 화신


Python, JavaScript 는 객체지향을 안쓰고도 좋은 프로그램을 만들수 있지만, 자바는 객체지향을 모르고 좋은 Java 프로그램을 만들 수 없다. 



   객체 지향 프로그래밍


객체 지향 프로그래밍은 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것이다. 객체는 변수와 메소드를 그룹핑한 것이다. 이 객체들을 마치 레고 블럭처럼 조립해서 하나의 프로그램을 만드는 것이 객체지향 프로그래밍이라고 할 수 있다. 객체 지향 프로그래밍의 특성은 다음과 같다. 

  • 부품화 or 분류화  : 연관된 메소드와 그 메소드가 사용하는 변수들을 분류하고 그룹핑. 문제가 생겼을 때 그 문제가 어디에서 발생한 것인지 파악하고 해결하기가 훨씬 쉬워짐.
  • 은닉화, 캡슐화 : 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것. 
  • 인터페이스 : 부품(객체)들 간의 약속. 각각의 부품은 미리 정해진 약속에 따라서 데이터를 입, 출력하고, 그를 위한 연결점(입,출력 데이터의 수, 타입 등)을 표준화 한 것

 

   클래스(class)와 인스턴스(instance) 그리고 객체(object)


클래스 : 연관되어 있는 변수와 메소드들의 집합. 객체를 만들기 위한 설계도. 이름이 대문자로 시작

클래스를 만든다는 것은 '상용자 정의 데이터 타입'을 만드는 것과 같은 의미이다.


인스턴스 : 설계도에 따라서 만든 구체적인 객체. 메소드를 호출.

클래스에 new 키워드를 상용해서 instance를 생성 가능 (인스턴스화). 따라서 하나의 클래스가 여러개의 인스턴삭 될 수 있다. 


객체는 클래스 일까? 인스턴스일까?  다소 논란이 있지만 일반적으로 설계도인 클래스가 구체적인 인스턴스가 되었을 때 객체라고 부른다. 

this는 instance 자신을 나타냄 


객체를 만들어 사용하는 이유는 재활용성을 높이기 위해서 이다. 

변수는 다른 말로는 상태(state)라고도 표현한다. 메소드를 다른 말로는 행동(behave)라고도 표현한다. 



   클래스 멤버와 인스턴스 멤버


클래스 변수를 정의할 때 static을 붙인다. 클래스 변수는 Class 통해서 접근 할 수 있고 그것의 instance를 통해서 접근 할 수도 있다. 

클래스 변수의 용도

  • 인스턴스에 따라서 변하지 않는 값이 필요한 경우 (이런 경우 final을 이용해서 상수로 선언하는 것이 바람직 하지만 final을 아직 배우지 않았기 때문에 언급하지 않았다)
  • 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
  • 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우

클래스 메소드를 정의할 때 static을 붙인다. 클래스를 통해서 직접적으로 접근해서 실행 할 수 있다. 따라서 만약 메소드가 인스턴스 변수를 참조하지 않는다면 클래스 메소드를 사용함으로써 불필요한 인스턴스의 생성을 막을 수 있다. 


인스턴스 메소드클래스 멤버에 접근 할 수 있다. 

클래스 메소드인스턴스 멤버에 접근 할 수 없다. 

인스턴스 변수는 인스턴스가 만들어지면서 생선되는데, 클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 멤버에 접근 하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것과 같다. 


인스턴스 변수와 클래스 변수는 아래와 같이 부르기도 한다.

인스턴스 변수 -> Non-Static Field

클래스 변수 -> Static Field

필드(field)라는 것은 클래스 전역에서 접근 할 수 있는 변수를 의미한다.



   유효범위


 프로그램이 커지면 여러가지 이유로 이름이 충돌하게 된다. 이를 해결하기 위해서 고안된 것이 유효범위라는 개념이다. 흔히 스코프(Scope)라고도 부른다. 유효범위란 변수를 전역변수, 지역변수 나눠서 좀 더 관리하기 편리하도록 한 것이다. 유효범위는 암시적인 기능이라고 할 수 있기 때문에 자연스럽게 알게 되는 부분이다. (C언어에서와 같은 개념이네.....지역변수, 전역변수)



   초기화와 생성자(constructor)


객체 지향 프로그래밍도 초기화에 해당하는 기능이 제공되는데 이것을 생성자(constructor)라고 한다. 생성자는 객체를 생성할 때 가장 먼저 호출 된다. 생성자의 특징은 아래와 같이 정리할 수 있다.

  • 값을 반환하지 않는다. 생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드라고 할 수 있다. 그런데 반환 값이 있다면 엉뚱한 객체가 생성될 것이다. 따라서 반환 값을 필요로하는 작업에서는 생성자를 사용하지 않는다. 반환 값이 없기 때문에 return도 사용하지 않고, 반환 값을 메소드 정의에 포함시키지도 않는다.
  • 생성자의 이름클래스의 이름동일하다. 자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다.


   상속 (inheritance)


어떤 객체가 있을때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속이라고 한다. extends 키워드를 사용한다. 

상속은 객체지향의 재활용성을 극대화시킨 프로그래밍 기법이라고 할 수있다. 동시에 객체지향을 복잡하게 하는 주요 원인이라고도 할 수 있다. 


기존의 객체를 그대로 유지하면서 어떤 기능을 추가하는 방법이 없을까? 이런 맥락에서 등장하는 것이 상속이다. 즉 기존의 객체를 수정하지 않으면서 새로운 객체가 기존의 객체를 기반으로 만들어지게 되는 것이다. 이때 기존의 객체는 기능을 물려준다는 의미에서 부모 객체가 되고 새로운 객체는 기존 객체의 기능을 물려받는다는 의미에서 자식 객체가 된다. 그 관계를 반영해서 실제 코드로 클래스를 정의해보자.


부모 클래스와 자식 클래스의 관계를 상위(super) 클래스와 하위(sub) 클래스라고 표현하기도 한다. 또한 기초 클래스(base class), 유도 클래스(derived class)라고도 부른다. 


상속한 클래스를 다시 상속할 수도 있다.



   상속과 생성자


상위 클래스의 메소드를 호출하기 위해서 super를 사용한다. super 키워드는 부모 클래스를 의미한다. 뒤에 ( )를 붙이면 부모 클래스의 생성자를 의미하게 된다. 


하위 클래스의 생성자에서 super를 사용할 때 주의할 점은 super가 가장 먼저 나타나야 한다는 점이다. 즉 부모가 초기화되기 전에 자식이 초기화되는 일을 방지하기 위한 정책이라고 생각하자.



   오버라이딩(overriding)


하위 클래스에서 상의 클래스와 동일한 메소드를 정의하면 부모 클래스로부터 물려 받은 기본 동작 방법을 변경하는 효과를 갖게 된다. 기본동작은 폭넓게 적용되고, 예외적인 동작은 더 높은 우선순위를 갖게하고 있다. 이것을 메소드 오버라이딩(overriding)이라고 한다.


오버라이딩을 하기 위해서는 아래의 조건을 충족시켜야 한다.

  • 메소드의 이름
  • 메소드 매개변수의 숫자와 데이터 타입 그리고 순서
  • 메소드의 리턴 타입

위와 같이 메소드의 형태를 정의하는 사항들을 통털어서 메소드의 서명(signature)라고 한다.



  오버로딩(overloading)


이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법을 메소드 오버로딩(overloading)이라고 한다.


메소드 오버로딩은 매개변수를 사용한다. 즉 매개변수가 다르면 이름이 같아도 서로 다른 메소드가 되는 것이다. 반면에 매개변수는 같지만 리턴타입이 다르면 오류가 발생한다.



  클래스 패스(class path), 환경 변수 


컴파일을 하면 클래스 하나가 하나의 클래스 파일이 된다. 소스코드가 1개면 컴파일후 1개의 파일이 생성되는 것이 아니라 소스 코드 안에 클래스의 갯수만큼 생성된다. 


그리고 이 class파일들은 자파를 실행할 때 필요하면 읽어 들여서 사용된다. 하지만 자바 실행 파일(main함수가 들어있는 파일)과 같은 디렉토리에 필요로하는 class파일이 있지 않다면 error를 발생한다. 따라서 자바를 실행할때 구성되는 class파일의 위치를 알려줘야 에러가 뜨지 않는다. 아래는 자바 실행시 클래스 패스를 설정하는 방법이다. 


환경변수 : 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수의 값을 참고해서 동작하게 된다. 자바는 클래스 패스로 환경변수 CLASSPATH를 사용하는데 이 값을 지정하면 실행할 때마다 -classpath 옵션을 사용하지 않아도 되기 때문에 편리하다. 하지만 운영체제를 변경(다른 컴퓨터에서 실행)하면 클래스 패스가 사라지기(지정되어있지 않기) 때문에 이식성면에서 불리할 수 있다.



  패키지 (package)


하나의 클래스 안에서 같은 이름의 클래스들을 사용하기 위한 방법이라고 할 수 있다. 비유를 해보자. 서로 다른 내용의 파일 java.txt가 하나의 컴퓨터에 동시에 공존할 수는 없다. 그래서 고안된 것이 디렉토리다. java.txt 파일을 각각 a와 b라는 디렉터리에 저장한다면 하나의 컴퓨터 안에 같은 이름의 파일이 공존할 수 있게 된다. 누군가에게 'a 디렉터리에 있는 java.txt'를 이메일로 보내달라고 요청할 수 있게 되는 것이다.

패키지도 이와 유사하다. 클래스가 많아짐에 따라서 같은 이름을 가진 클래스가 생겨날 가능성이 높아지게 되는데 이름의 충돌을 방지하기 위한 고안된 것이 패키지라고 할 수 있다. 정보 공학에서는 '이름의 충돌'이라는 문제를 해결하기 위해서 다양한 노력을 하고 있다. 전역변수와 지역변수, 객체도 그런 연장선에 있다고 볼 수 있다.




  API (Application programming interface)


자바 플랫폼 위에서 동작하는 자바 애플리케이션을 개발하는 개발자들은 자바 API를 사용하게 된다. 그런데 자바에서 제공하는 API는 방대하기 때문에 이것을 이용하기 위해서는 API의 목록과 사용법이 체계적으로 정리된 문서를 이용할 수 있어야 한다. 아래 페이지는 Java의 각종 문서들을 모아둔 웹페이지다.

http://docs.oracle.com/javase/

이중에서 API Documentation을 클릭한다.


자바를 통해서 어떤 문제를 해결하기 위해서는 우선 자신이 필요한 로직이 담겨있을 것으로 기대되는 패키지의 후보군을 선정해야 한다. 자바에서 제공하는 기본 패키지들은 아래와 같은 기능을 담고 있다.

  • java.lang : 자바 프로그래밍을 위한 가장 기본적인 패키지와 클래스를 포함하고 있다
  • java.util : 프로그램을 제어하기 위한 클래스와 데이터를 효율적으로 저장하기 위한 클래스들을 담고 있다.
  • java.io : 키보드, 모니터, 프린터, 파일등을 제어할 수 있는 클래스들의 모음
  • java.net : 통신을 위한 기능들을 담고 있다.


  접근 제어자 (access modifier)


접근 제어자를 사용하는 이유는 맴버에 따라서 외부의 접근을 허용하거나 차단함으로써 객체의 로직을 보호하기 위해서이다. 또한 사용자에게 객체를 조작 할 수 있는 수단만을 제공함으로서 결과적으로 객체의 사용에 집중 할 수 있도록 돕기 위함이다.


접근 제어자멤버 접근 제어자클래스 접근 제어자로 분류 할 수있다. 


멤버 접근 제어자는 아래 와 같이 Public, protected, default, private이 있다. 

클래스의 접근 제어자는 총 2개로 publicdefault이다. default는 접근 제어자를 붙이지 않은 경우 default가 된다. 클래스의 접근 제어자는 패키지와 관련된 개념이다. 즉 접근 제어자가 public인 클래스는 다른 패키지의 클래스에서도 사용할 수 있고, default인 경우는 같은 패키지에서만 사용 가능하다.




  abstract


abstract는 클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것이다.


클래스의 내부에 하나라도 abstract 메소드가 있다면 그 클래스 또한 abstract 클래스가 된다. 


상황에 따라서 동작 방법이 달라지는 메소드는 추상 메소드로 만들어서 하위 클래스(상속 받은 클래스)에서 구현하도록 하고 모든 클래스의 공통분모의 경우에는 상위 클래스에 두어서 코드의 중복, 유지보수의 편의성 등을 꾀할 수 있다.



  디자인 패턴


프로그래밍이라는 것은 반복되는 패턴이 있다. 이런 패턴들을 모아서 정리한 것이 디자인 패턴(design pattern)이다. 물론 시각 디자이너들의 디자인이 아니라 좋은 소프트웨어를 만들기 위한 설계로서 디자인이라는 표현을 쓰고 있는 것이다. 디자인 패턴의 장점은 크게 두가지이다. 하나는 좋은 설계를 단기간에 학습할 수 있다는 점이다. 물론 비교적 단기간이라는 뜻이다. 다른 하나는 소통에 도움이 된다는 점이다. 설계 방법을 토의하거나 전달할 때 설계 방법에 따라 적절한 이름이 있다면 상호간에 생각을 일치시키는 데 큰 도움이 될 것이다.



  final


final은 상속이나 변경을 금지 할때 사용하는 것이다. abstract와 상반되는 키워드이다. 



  인터페이스(interface)


어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의  메소드들을 구현해야 한다. 만약 인터페이스에서 강제하고 있는 메소드를 구현하지 않으면 이 에플리케이션은 컴파일 조차 되지 않는다.


인터페이스와 상속은 다르다. 상속이 상위 클래스의 기능을 하위 클래스가 물려 받는 것이라고 한다면, 인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다. 


또 사용하는 키워드도 다르다. 클래스를 선언 할 때는 class를 사용하지만 인터페이스는 interface를 사용한다. 또 상속은 extends를 사용하지만 인터페이스는 implements를 사용한다.


인터페이스의 규칙

  • 하나의 클래스가 여러개의 인터페이스를 구현할 수 있다. 
  • 인터페이스도 상속이 된다. 
  • 인터페이스의 멤버는 반드시 public이다.
abstract vs interface
인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다. 인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면 추상 클래스는 일반적인 클래스다. 또 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고, 추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.


  다형성(polymorphism)


다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 마찬가지로 인터페이스도 다형성을 가질 수 있다. 어떤 클래스가 여러 인터페이스를 구현한 것일 때, 그 클래스를 인스턴스화 했을 때 해당 인스턴스의 데이터 타입을 무엇으로 하느냐에 따라 가능한(사용할 수 있는) 메소드(behave)가 결정된다. 



  예외(exception)


프로그래밍을 하면 많은 오류 상황에 직면하게 된다. 기능이 많아질수록 오류가 발생할 확률은 기하급수적으로 증가한다. 자연스럽게 오류를 잘 처리하기 위한 방법들이 필요해지게 된다. 예외(Exception)란 프로그램을 만든 프로그래머가 상정한 정상적인 처리에서 벗어나는 경우에 이를 처리하기 위한 방법이다.


try-catch 문법을 이용하여 이러한 예외 상황을 체크할 수 있다. 

try 안에는 예외 상황이 발생할 것으로 예상되는 로직을 위치시킨다. catch 안에는 예외가 발생했을 때 뒷수습을 하기 위한 로직이 위치한다.

프로그램을 실했하였을때 try 구문 안에서 오류가 발생하면서 try 내의 실행이 중단되고 catch 구문 안의 내용이 실행된다.


catch는 여러개를 쓸수 있다. 마치 if, else if 처럼.  여러 catch가 있을 경우 순차적으로 조건을 체크함으로, 그 순서를 잘 생각해서 설정해야한다. 


finally는  try 구문에서 예외가 발생하는 것과 상관없이 언제나 실행되는 로직이다.



  Throws 와 throw


예외에 대한 처리를 생성자의 사용자에게 위임하겠다는 의미다. 그것을 던진다(throw)고 표현하고 있다. 따라서 API의 사용자 쪽에서는 예외에 대한 처리를 반드시 해야 한다는 의미다.


throw는 예외를 발생시키는 명령이다. throw 뒤에는 예외 정보를 가지고 있는 예외 클래스가 위치한다. 자바 가상 머신은 이 클래스를 기준으로 어떤 catch 구문을 실행할 것인지를 결정한다. 또 실행되는 catch 구문에서는 예외 클래스를 통해서 예외 상황의 원인에 대한 다양한 정보를 얻을 수 있다. 이 정보를 바탕으로 문제를 해결하게 된다.


ArithmeticException, IOException 모두 Exception이다. 그럼에도 불구하고 IOException만 try...catch 혹은 throw 를 해야 한다. 자바는 이 두개의 예외를 다른 방법으로 대하고 있는 것이다.  IOException은 예외처리를 강제하고 있지만 ArithmeticException은 그렇지 않다 점이다. 그 이유를 알아보자.



  Object class


자바에서 모든 클래스는 사실 Object를 암시적으로 상속받고 있는 것이다. 그런 점에서 Object는 모든 클래스의 조상이라고 할 수 있다. 그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서다.


● toString( ) 

객체를 문자로 표현하는 메소드이다. 


● equals( )

객체와 객체가 같은 것인지를 비교하는 API이다. 메소드 equals에 대해서 권고하는 점은 아래와 같다.

  1.  객체 간에 동일성을 비교하고 싶을 때는 ==를 사용하지 말고 equals를 이용하자.
  2.  equals를 직접 구현해야 한다면 hashCode도 함께 구현해야 함을 알고 이에 대한 분명한 학습을 한 후에 구현하자.
  3.  equals를 직접 구현해야 한다면 eclipse와 같은 개발도구들은 equals와 hashCode를 자동으로 생성해주는 기능을 가지고 있다.
  4.  그 이유가 분명하지 않다면 비교 연산자 == 은 원시 데이터형을 비교할 때만 사용하자.

원시 데이터 형(Primitive Data Type)이란 자바에서 기본적으로 제공하는 데이터 타입으로 byte, short, int, long, float, double, boolean, char가 있다. 이러한 데이터 타입들은 new 연산자를 이용해서 생성하지 않아도 사용될 수 있다는 특징이 있다.


객체나 String은 equals를 사용



  finalize


객체가 소멸될 때 호출되기로 약속된 메소드이다.  많은 자바의 전문가들이 이 메소드의 사용을 만류하고 있다. 이 메소드 보다는 가비지 컬렉션(garbage collection)에 대해서 알아보자. 


garbage collection 에 대한 내용은 여기서 참고 

https://d2.naver.com/helloworld/1329



  clone


어떤 객체가 있을 때 그 객체와 똑같은 객체를 복제해주는 기능을 수행하는 메소드이다. 



  enum


enum은 열거형(enumerated type)이라고 부른다. 열거형은 서로 연관된 상수들의 집합이라고 할 수 있다.


enum이 서로 다른 상수 그룹에 대한 비교를 컴파일 시점에서 차단할 수 있다. 상수 그룹 별로 클래스를 만든 것의 효과를 enum도 갖는다는 것을 알 수 있다. 

enum을 사용하는 이유를 정리하면 아래와 같다.

  • 코드가 단순해진다.
  • 인스턴스 생성과 상속을 방지한다.
  • 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.
열거형의 특성을 정리해보자. 열거형은 연관된 값들을 저장한다. 또 그 값들이 변경되지 않도록 보장한다. 뿐만 아니라 열거형 자체가 클래스이기 때문에 열거형 내부에 생성자, 필드, 메소드를 가질 수 있어서 단순히 상수가 아니라 더 많은 역할을 할 수 있다.



  참조(reference)


c언어에서 포인터랑 느낌이 비슷하다. 아래의 예쩨를 먼저 보자



전자는 데이터형이 int이고 후자는 A이다. int는 기본 데이터형(원시 데이터형, Primitive Data Types)이다. 자바에서는 기본 데이터형을 제외한 모든 데이터 타입은 참조 데이터형(참조 자료형)이라고 부른다. 기본 데이터형은 위와 같이 복제 되지만 참조 데이터형은 참조. new를 사용해서 객체를 만드는 모든 데이터 타입이 참조 데이터형이라고 생각해도 된다. (단 String은 제외다) 이를 그림으로 나타내면 아래와 같다.

정리하면 변수에 담겨있는 데이터가 기본형이면 그 안에는 실제 데이터가 들어있고, 기본형이 아니면 변수 안에는 데이터에 대한 참조 방법이 들어있다고 할 수 있다.



  제네릭(generic)


클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미. 인스턴스화할때 정의 

각각의 인스턴스를 생성할 때 사용한 < > 사이에 어떤 데이터 타입을 사용하느냐에 따라 내부의 변수의 데이터 타입을 설정할 수 있다. 

  • 제네릭은 생략 가능하다.
  • 제네릭은 메소드에 적용할 수도 있다. 
  • 제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다
  • 제네릭을 나타내는 < > 사이에 들어오는 extends는 앞서공부한 상속의 의미가 아니다. '자식'이라고 해석해야하나? 아무튼, 어떤 interface 의 자식들에 대해서 제네릭을 허용할 경우에도 implements가 아니라 extends를 사용한다.

  Collection Framework


배열은 연관된 데이터를 관리하기 위한 수단이었다. 그런데 배열에는 몇가지 불편한 점이 있었는데 그 중의 하나가 한번 정해진 배열의 크기를 변경할 수 없다는 점이다. 이러한 불편함을 컬렉션즈 프래임워크를 사용하면 줄어든다.


아래는 컬렉션즈 프래임워크의 구성을 보여준다. Collection과 Map이라는 최상위 카테고리가 있고, 그 아래에 다양한 컬렉션들이 존재한다. ArrayList를 찾아보자. Collection-List에 속해있다. ArrayList는 LIst라는 성격으로 분류되고 있는 것이다. List는 인터페이스이다. 그리고 List 하위의 클래스들은 모두 List 인터페이스를 구현하기 때문에 모두 같은 API를 가지고 있다. 클래스의 취지에 따라서 구현방법과 동작방법은 다르지만 공통의 조작방법을 가지고 있는 것이다. 

위의 그림을 좀더 세부적으로 보려면 아래의 링크를 클릭.

https://prashantgaurav1.files.wordpress.com/2013/12/java-util-collection.gif


알고리즘, 자료구조를 공부하면 collection framework 에 대해 더 깊이 있게 알 수있다. 



이고잉님이 추천하는 Java 강의 or 도서

  • 도서 effective Java (조슈아 블로크) 
  • 도서 & 강의 난 정말 JAVA를 공부한 적이 없다구요 (윤성우 저)
  • 도서 소설 같은 자바
  • 도서 & 강의 점프 투 자바




반응형