korean IT student

JAVA-요약 본문

back-end/JAVA

JAVA-요약

현창이 2017. 10. 13. 14:22

JAVA

클래스

인스턴스

클래스 메서드(static 메서드) 와 인스턴스 메서드


오버로딩(하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것)

- 메서드 이름이 같아야 한다.

- 매개변수의 개수 또는 타입이 달라야 한다.


상속(inheritance)-기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다,


오버라이딩(overriding)-조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것


super()- 조상 클래스의 생성자를 호출


instanceof연산자

-참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof연산자를 사용한다.


제어자(modifier-클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.)

 접근 제어자 -public, protected(자손클래스까지), private(같은클래스), default(같은클래스, 같은 패키지)

static- static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.

final- 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면

자신을 확장하는 자손클래스를 정의하지 못하게 된다.


다형성(polymorphism)-조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.

반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.



추상클래스(abstract class)- 강제로 부모클래스에서 자식클래스에게 메소드를  강제로 재정의(override) 하게 할수 있다.  

-추상메소드가 많으면 클래스명위에 ctrl +1 하면 자동으로 오버라이드가 된다

abstract가 사용될 수 있는 곳-클래스,메서드

instanceof연산자-참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용한다


여러 종류의 객체를 배열로 다루기-

vector()-10개의 객체를 저장할 수 있는 vector인스턴스를 생성한다. 10개 이상의 인스턴스가 저장되면, 자동적으로 크기가 증가



인터페이스(interface)-오직 추상메서드와 상수만을 멤버로 가질 수 있다, 다중상속 implements

class 대신 interface 사용, 클래스와 같이 접근제어자로 public or default를 사용할 수 있다.


익명 클래스(anonymous class)-이름이 없는 클래스



예외처리(exception handling)-프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것, 갑작스런 비정상 종료를 막고, 정상적인 실행상태를 유지할 수 있도록 하는 것

try ~catch

finally -무조권 실행

throws-예외를 발생시킨 호출 쪽으로 예외를 던져버리는 방식 ex) interface throws Exception ,void method throws Exception

e.getMessage() -어떠한 오류가 있는지 나타낸다.

e.printstacktrace()


java.lang패키지

Object 클래스

-equals(Object obj) -매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려 주는 역할을 한다.

                             두 개의 참조변수가 같은 객체를 참조하고 있는지, 즉 두 참조변수에 저장된 값(주소값)이 같은지를 판단하는

                             기능밖에 할 수 없다

-hashCode()- 해싱기법에 사용되는 해시함수를 구현한 것이다.

-toString()- 인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 것이다. 적절한 오버라이딩이 필요하다.

public String toString(){

return 

}

-clone()-단순히 인스턴스변수의 값만을 복사  shallow copy,  deep copy

-getClass() - class객체를 이용해서 객체 생성 ex) Card c =Card.class.newInstance();  예외처리가 필요하다.


String클래스

-string의 경우만 객체데이터 이지만, 기초데이터처럼 사용할 수 있다. String string ="hi"; String string = new String("hi");

-str1.concat(str2) :문자열 연결, substring(3):문자열 자르기, length():문자열 길이, toUpperCase():대문자로 만들기, 

toLowerCase(): 소문자로 만들기,charAt(3):특정위치의 글자 찾기,indexOf('c'):특정문자열의 위치, equals(str2): 문자열 비교,

trim(): 문자열 공백제거, replace('a,z'): 특정문자 변경

-string의 문제점- 메모리를 과소비 한다. 처음 초기화된 데이터에 변화가 생기면 기존 것을 재활용 하기보다는 새것을 찾는다.


속도적인 측면에서 더욱 개선된 StringBuffer와 StringBuilder  둘다 같다 bulider 속도 면에서 좀 더빠르다.

인스턴스를 생성할 때 지정된 문자열을 변경할 수 있다.

생성법: StringBuilder stringbuilder =new StringBuilder("abcde");

stringbuilder.append():문자열 추가, insert(3,'aaa'): 특정 위치에 문자열 추가, delete(3,5):문자열삭제,

deleteCharAt(10): 특정 문자 하나 삭제


래퍼(wrapper)클래스 -기본형 변수도로 객체로 다뤄야 하는 경우 


오토 박싱 (autoboxint) 과 언박싱(unboxing) -기본형 값을 래퍼 클래스의 객체로 자동 형변환 해주는것 


컬렉션 프레임웍(Collection Framework)

-데이터 군을 저장하는 클래스들을 표준화한 설계

-자료구조,배열


Collection인터페이스(List와 Set의 조상)

-컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메서드들을 정의


List인터페이스

-중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다


Set인터페이스

-중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현 (HashSet,TreeSet)


Map인터페이스

-키와 값을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용된다.

-Map.Entry는 Map인터페이스의 내부 인터페이스이다.

  Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 Entry인터페이스를 정의되어 있다. 객체지향적으로 설계하도록 유도하기 위한 것으로 Map인터페이스를 구현하는 클래스에서는 Map.Entry인터페이스도 함께 구현해야한다.


ArrayList

-List인터페이스를 구현하기 때문에 데이터 저장순서가 유지되고 중복을 허용한다는 특징을 갖는다.


LinkedList

-데이터를 읽어오는데 걸리는 시간이 가장 빠르다.

-크기를 변경할 수 없다.(새로운 배열을 생성해서 데이터를 복사하는 작업이 필요, 메모리 낭비가 있다.

-비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

-링크그 리스트는 이동방향이 단방향이기 때문에 다음 요소에 접근은 쉽지만 이전요소에 대한 접근이 어렵다. 이 점을

  보완한 것이 더블 링크드 리스트(double linked list) 단순히 링크드 리스트에 참조변수를 하나 더 추가하여 이전 요소에 대한  참조가 

  가능하도록 했을 뿐, 그 외에는 링크드 리스트와 같다.


Stack과 Queue

-스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 (Last In First Out)구조(예-수식계산, 수식괄호검사,undo/redo, 웹 뒤로/앞으로

-큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 (First In First out)구조(예-최근사용문서, 인쇄작업 대기목록, 버퍼


Iterator

-컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다.

-Collection인터페이스에 정의된 메서드이므로 Collection인터페이스의 자손인 List와 Set에도 포함되어 있다.

-컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 다음 반복문, 주로 While문을 사용해서 컬렉션 클래스의 요소들을 읽어 올 수 있다.

-boolean hasNext() 읽어 올 요소가 남아있는지 확인한다. 있으면 true 없으면 false 반환

-Object next() 다음 요소를 읽어 온다 .next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전

-void remove() next()로 읽어 온 요소를 삭제한다.

-Map인터페이스를 구현한 컬렉션 클래스는 키와 값을 쌍으로 저장하고 있기 때문에 직접 호출할 수 없고, keySet()이나

 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set의 형태로 얻어 온 후에 다시 iterator()를 호출 해야 된다.



HashSet

-Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.

-새로운 요소를 추가할 때는 add메서드나 addAll메서드를 사용 중복된 요소를 추가하고자 한다면 false를 반환함으로써 실패 알림


TreeSet

-이진 검색 트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스

-Set인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장순서를 유지하지도 않는다.


HashMap

-Map의 특징, 키와 값을 묶어서 하나의 데이터(entry)로 저장한다는 특징

-해싱을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.


TreeMap

-이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다. 검색과 정렬에 적합한 컬렉션 클래스이다.


지네릭스(Generics)

-장점: 타입 안정성을 제공한다, 코드 간결해 진다.

-객체의 타입을 미리 명시해줌으로써 번거러운 형변환을 줄여준다.

ex)

class Box<T>{}

Box<String> box =new Box<String>();

-제한된 지네릭 클래스 

  class box<T extends Fruit> //Fruit의 자손만 타입으로 지정가능

-와일드 카드

-제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신 와일드 카드를 다음과 같이 세 가지 형태로 사용할 수 있습니다.

<? extends T> T와 그 자손들만 가능

<? super T> T와 그 조상들만 가능

<?> 모든 타입이 가능


열거형(enums)

- enum 열거형이름{상수명1,상수명2,...}



애너테이션(annotation)

-소스코드의 주석에 소스코드에 대한 정보를 저장하고, 소스코드의 주석으로부터 HTML문서를 생성해내는 프로그램을 만들어서 사용

-@Override 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다.

-@Deprecated 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다.

-@SuppressWarnings 컴파일러의 특정 경고메시지가 나타나지 않게 해준다.





스레드(멀티스레드)


-하나의 프로세스에서 다시 여러 가지 일을 하는 것(동일안 채팅 프로그램에서 파일전송과 채팅을 동시에 하고 있는 것

-스레드는 두 가지 형태로 존재. 하나는 객체 하나를 n개의 스레드가 공유 하는 방식이고, 또 다른 하나는 객체 하나당 하나의 스레드가 존재하는 방식

-Runnable 인터페이스 구현을 통한 Thread ,Thread 클래스를 상속 통한 Thread

  run()메소드를 오버라이드 해야한다.

  Runnable 인터페이스 재사용성이 높고 코드의 일관성을 유지할 수 있기 때문에 보다 객체지향적인 방법

   쓰레드의 실행 -start()를 호출해야만 쓰레드가 실행된다. 하나의 쓰레드에 대해 한 번만 호출될 수 있다.

   start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한 다음에 run()을 호출해서, 생성된 호출스택에 run()이 

   첫 번째로 올라가게 한다.

-데몬 쓰레드 

 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료

 setDaemon(boolean on) 

 


-synchronized 먼저 수행되는 스레드의 모든작업이 끝날때까지 다른 스레드는 기다린다.

-wait(), notify(), notifyAll()

  wait()-객체의 lock을 풀고 해당 객체의 쓰레드를 waiting pool에 넣는다.

  notify()-waiting pool에서 대기중인 쓰레드 중의 하나를 깨운다.

  Object에 정의되어 있다.

  동기화 블록내에서만 사용할 수 있다.

  보다 효율적인 동기화를 가능하게 한다.



입출력(I/O)란

-입력과 출력을 뜻한다. 

-컴퓨터에 입력하는 것이 Input이며, 컴퓨터가 어떤 것을 출력하는 것을 Output이다.

-InputStream,OutputStream(이미지, 동영상등의 데이터에 주로 사용 1byte)

-Reader,Writer(문자열에 주로 사용 2byte)

-문자데이터를 입출력할 때는 바이트기반 스트림 대신 문자기반 스트림을 이용하자.


-InputStream

 데이터를 읽어온다.

 InputStream(추상)클래스를 이용해서 객체를 만든다. 또는 다른 클래스의 메소드에서 반환되는 타입 객체를 쓴다. 

 read()메소드를 이용해서 데이터를 읽으면 된다. 1byte씩 읽는다 읽을 것이 없을땐 -1을 반환한다.

 read(byte[])- byte[]만큼씩 읽는다 속도가 빠르다.


-OutputStream

 데이터를 쓴다.

 OutputStream 클래스를 이용해서 객체를 만든다.

 write()메서도를 이용해서 데이터를 읽는다.

 write(), write(byte[]), write(byte[], int,int) 세개의 메소드를 이용

 write(byte[], int,int)는 데이터를 원하는 위치에서 원하는 숫자만큼 쓸 수 있다


-보조 스트림

 스트림 기능을 보완하기 위한 보조스트림 제공

 보조 스트림만으로는 입출력을 처리할 수 없고, 스트림을 먼저 생성한 다음에 이를 이용해서 보조스트림을 생성해야한다.

 BufferedInputStream/BufferedReader   바이트기반/문자기반

 BufferdOutputStream/BufferedWriter  버퍼를 이용한 입출력 성능향상


DataInputStram,DataOutputStram - 문자열 읽고, 쓰기

-byte단위로 문자열을 처리하는 InputStram,OutputStram 보다 편리하게 고안된 클래스

-데이터를 읽고 쓰는데 있어서 byte단위가 아닌, 8가지 기본 자료형의 단위로 읽고 쓸 수 있다는 장점이 있다.


BufferedInputStream,BufferdOutputStream

-한 바이트씩 입출력하는 것 보다는 버퍼(바이트배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르기 때문에 대부분 입출력 작업에 사용된다.


BufferedReader의 readLine()을 사용하면 데이터를 라인단위로 읽어 올 수 있다.

BufferedWriter의 newLine()라는 줄바꿈 해주는 메서드를 가지고 있다.


InputStreamReader/OutputStreamWriter 바이트기반스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다. 그리고 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행.


PrintStream

-데이터를 기반스트림에 다양한 형태로 출력할 수 있는 pirnt, println, printf와 같은 메서드를 오버로딩하여 제공하다.

-다양한 언어의 문자를 처리하는데 적합하기 때문에 가능하면 PrintWriter를 사용하는 것이 좋다.

-printStream(OutputStram out, true/false) autoflush의 값을 true로 하면 println메서드가 호출되거나 개행문자가 출력될 때 자동으로   

flush된다. 기본 값은 false이다.


RadomAccessFile

-하나의 클래스로 파일에 대한 입력과 출력을 모두 할 수 있도록 되어 있다.

-가장 큰 장점은 파일의 어느 위치에나 읽기/쓰기가 가능하다는 것이다.


직렬화(Serialization)

-객체를 데이터 스트림으로 만드는 것을 뜻한다.

-직렬화(스트림에 객체를 출력)에는 ObjectOutputStream을 사용하고 역직렬화(스트림으로 부터 객체를 입력)에는 ObjectInputStream을 사용한다.

-InputStream과 OutputStream을 직접 상속받지만 기반스트림을 필요로 하는 보조스트림이다.



JAVA 입출력 API(Input~, Output~)

-예외 처리와 무조건 close()실행

-I/O 예외처리를 강제성( try ~catch ,throws)


JAVA 네트워크

-InetAddress -호스트의 IP주소를 비롯한 네트워크상의 정보를 얻어오는 클래스 입니다.

-URLConnection

 URL클래스: DNS를 통한 IP정보를 이용하여, URL객체를 만든 후 네트워크 접속 및 URL정보를 얻어온다.

 URLConnection 클래스: 추상클래스로 URL객체로부터 생성.URL클래스의 openConnection()메소드를 이용


socket

-InputStram과 OutputStram을 가지고 있다. 그러므로 자손을 쓸수 있다.

-네트워크상에서 서로 다른 호스트 사이의 통신을 위한 수단

 1.Server에서 ServerSocket을 만들고, 클라이언트의 요청을 기다림

2.Client에서 Socket을 만들고, I/O Stream을 만들어 Server로 요청을 함

3. Server에서 Client의 요청을 받아 Socket을 만들고, I/O Stream을 만듦

4.통신함

5.Socket 닫음.


ServerSocket

-포트와 연결되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다.

-한 포트에 하나의 ServerSocket만 연결 할 수 있다.(프로토콜이 다르면 같은 프토를 공유 가능)


ex)

서버 소켓 생성 - serverSocket = new ServerSocket(7777);  (Server.java)

서버 소켓이 클라이언트 프로그램의 연결요청을 처리할 수 있도록 대기상태로 만든다. 클라이언트 프로그램의 연결요청이 오면 새로운 소켓을 생성해서 클라이언트 프로그램의 소켓과 연결한다 

Socket socket = serverSocket.accept();  (Server.java)

클라이언트 프로그램에서 소켓을 생성해서 서버소켓에 연결을 요청한다. (Client.java)

Socket socket = new Socket("아이피",7777);  (Client.java)

서버소켓은 클라이언트 프로그램의 연결요청을 받아 새로운 소켓을 생성하여 클라이언트 프로그램의 소켓과 연결한다.

Socket socket = serverSocket.accept();

서버소켓은 클라이언트 프로그램의 연결요청을 받아 새로운 소켓을 생성하여 클라이언트 프로그램의 소켓과 연결한다.


Comments