CheerUp_Cheers

자바 본문

CS

자바

meorimori 2020. 2. 11. 20:22

#질문

[자바]

  • 해시맵과 해시테이블의 차이.
  • 해시테이블은 왜 시간복잡도가 1일까.
  • 해시와 해시충돌?
  • 객체지형언어 특징(Solid)
  • 기본형과 참조형(Wrraper)의 차이점은?
  • 멀티쓰레드의 장단점?
  • 자바 콜렉션의 대표 인터페이스?
  • 접근제어지시자의 종류와 특성에 대하여 설명
  • 스레드 구현의 두가지 방법?
  • 인터페이스와 추상화를 설명하고 공통점 & 차이점.
  • 가비지 컬렉션이란?
  • 오버로딩과 오버라이딩 차이
  • 전역변수, 지역변수, 정적변수를 스택과 힙과 관련해사용.
  • inner 클래스란? 왜쓰는가?
  • 예외처리의 필요성과 목적?
  • JVM의 구성에 대하여 설명
  • 자바의 장단점
  • 기본형과 참조형의 차이점!(int와 Integer)
  • Call by value vs Call by reference
  • Static 멤버와 Non-Static멤버
  • Java의 '=='와 'Equals()'차이.
  • ArrayList vs LinkedList
  • 클래스, 객체 , 인스턴스의 차이?
  • 깊은 복사와 얕은 복사
  • Enum 사용하는 이유?
  • 코드영역, 데이터영역, 힙 메모리 영역과 스택 메모리 영역
  • String, StringBuffer, StringBuilder
  • 업캐스팅, 다운캐스팅?
  • 자바의 리플렉션 API를 이해하시나요?
  • 동기화 방법 3가지?
  • final과 static final?
  • 컴파일 에러, 런타임 에러 차이
  • iterator 정리.
  • 자바 소켓클래스 동기? 비동기?
  • 자바는 인터프리터? 컴파일?
  • 객체지향이란(oop) 무엇인가?
  • 정보은닉, 캡슐화, 추상화, 다형성?
  • 정규표현식?

 


#답

[자바]

  • *해시맵과 해시테이블의 차이.

- 해시맵

Key-Value형태로 삽입.

동기화를 제공.

Fail-Fast Iterator

검색할 수 있는 인터페이스

 

- 해시 테이블

Key-Value에 Null값 허용 x

다중스레드환경에서 동기화제공(느림).

HashTable은 열거형.

Single Lock


  • *해시테이블은 왜 시간복잡도가 1일까.

- 검색, 삭제, 삽입 과정에서 평균적으로 O(1) 시간복잡도

  ->특정한값을 접근할 때, index로 접근하기 때문에

- 충돌 때문에 항상은 아님.


  • 해시와 해시충돌?

#해싱

하나의 문자열을 원래의 것을 상징하는 더 짧은 길이의 값이나 키로 변환.

해싱은 해시 테이블해시 함수로 구성.

 

#해시 테이블, 해시 함수

- 해시 테이블(Hash Table, Hash Map) : Key - Value

- 해시 함수 : 키 값으로 레코드가 저장되어 있는 주소(색인)을 산출하는 함수.

 

#해시 충돌

다른 내용의 데이터가 같은 같은 키를 가진다? -> 해시충돌

해시 충돌은 해시테이블의 성능을 떨어뜨린다.

해시 함수 값의 입력값은 무한, 출력값의 가짓수는 유한 -> 무조건 충돌이 일어남!(비둘기집 원리)

 

#충돌 해결 방법

- 체이닝

버킷 내에 연결리스트를 할당.

버킷에 데이터를 삽입하다가 해시 충돌이 발생하면 연결리스트를 연결하는 방식.

버킷이 꽉차더라도 연결리스트로 계속 늘려서 데이터 주소값은 바뀌지 않음.

 

장점

- 연결리스트만 사용하면 됨으로, 복잡한 계싼식을 사용할 필요가 개방주소법에 비해 적음.

 

- 개방 주소법

해시 충돌이 일어나면 다른 버킷에 데이터를 삽입하는 방식.

1)선형탐색 : 다음 버켓, 혹은 몇개를 건너뛰어 데이터를 삽입.

2)제곱탐색 : 제곱만큼 건너뛴 버켓에 데이터를 삽입(1,4,9,16...)

3)이중해시 : 다른 해시함수를 한번 더 적용한 결과.

 

장점

- 삽입, 삭제 시 오버헤드가 적음.

- 저장할 데이터가 적을 때 유리.

- 체이닝 처럼 포인터가 필요없고, 지정된 메모리 외 추가적인 저장공간도 필요없다.


  • *객체지형언어 특징(Solid)

설계원칙.

 

S(SRP) - 단일 책임 원칙 : 하나의 클래스는 하나의 책임

O(OCP) - 개방 폐쇄 원칙 : 소프트웨어는 확장에는 열려있고, 변경에는 닫힘.

L(LSP) - 리스코프 치환 원칙 : 객체는 프로그램 정확성을 지키면서, 하위 타입 인스턴스 로 바꿀수있어야함

I(ISP) - 인터페이스 분리 법칙 : 특정클라이언트를 위한 여러 인터페이스가 범용보다 나아

D(DIP) - 의존관계 역전 원칙 : 추상화에 의존하지 구체화에 의존(X)

 

#설계 원칙을 학습하는 이유?

예측하지 못한 변경상항이 발생하더라도 유연하고 확장성이 있도록, 객체에 책임을 할당 해야함.


  • *기본형과 참조형(Wrraper)의 차이점은?

1)기본형 – 값을 저장하는 구조, 값 자체

- int, double, float, char...

2)참조형 – 주소를 저장(힙, static영역 메모리에 저장), 주소값, Wrraper클래스

- String, 객체

static – 프로그램 끝날때까지 데이터가 남음(메모리낭비)

heap – 한번 만들면 계속 남아잇지만, 가비지컬렉터가 정리.

 

#사용이유?

- 매개변수가 객체로 요구될 때.

- 객체간의 비교가 필요할 때.

- 객체로 저장해야 할 때.

 

#Unboxing

unboxing(랩퍼 클래스-->기본 자료형)

Integer obj2 = new Integer(69);

int num1 = obj2;

 

#Boxing

boxing(기본->랩퍼클래스)

Integer obj = 61; //61은 기본 자료형이지만

 


  • *멀티쓰레드의 장단점?

#장점

- 응답성(각기다른 작업)

- 자원공유 효율화

- 작업이 분리, 코드 간결

#단점

- 구현어렵

- 동기화에 주의

- 테스트, 디버깅 힘듬

- 교착상태가 안일어나게해야함.

- 문제시 전체 프로세스 영향(멀티프로세스는 자식이죽으면자식만).

- 성능저하(문맥전환의 빈번)


  • *자바 콜렉션의 대표 인터페이스?

정의 : 자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다
즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다.

주요 자바 인터페이스는(LIST, SET , MAP)

 

#종류

- 컬렉션

Set(중복 방지) - 순서가 x, HashSet, LinkedHashSet, Tree Set

List(중복 가능) - 순서가 o, ArrayList, Vector, LinkedList, 스택(벡터클래스상속)

Queue - PriorityQueue

 

- Map

SortedMap(TreeMap), O(logn)  : 레드-블랙트리로 저장. 오름차순.

HashTable(key-value)

LinkedHashMap, O(n)

HashMap, O(1)

 

- iterator


  • *접근제어지시자의 종류와 특성에 대하여 설명

모든패키지, 같은패키지(상속한거까지), 같은패키지, 같은클래스

Public > Protected > default > private


  • *스레드 구현의 두가지 방법?

1)Thread클래스 상속

2)Runnable 인터페이스 구현하여 run()메소드 구현.

둘다 객체를 만들고 start()하면됨.


  • *인터페이와 추상화를 설명하고 공통점 & 차이점.

#공통점

인스턴스(객체)를 생설할 수 없다.

선언만 있고 구현 내용이 없다.

자식 클래스가 메서드의 구체적인 동작을 구현하도록 책임을 위임한다.

 

- 인터페이스

구현을 하게함으로써 객체의 같은 동작 보장

클래스가 아님.

다중상속가능

 

- 추상화

상속을 받아서 기능을 확장하는데 목적(클래스)

클래스임.

다중상속 불가


  • *가비지 컬렉션이란?

메모리 관리기법중하나로, 프로그램에 동적으로 할당했떤 메모리영역중 필요없는 영역을 해제하는 기능.


  • *오버로딩과 오버라이딩 차이

- 오버로딩

두 메서드가 같은 이름을 갖고 있으나 인자의 수나 자료형이 다른 경우.

리턴값은 상관없음.

- 오버라이딩

상위 클래스의 메서드와 이름과 용례가 같은 함수를 하위클래스에서 재정의 하여 사용.

상속 관계에 있는 클래스 간에 같은 이름의 메서드를 정의.


  • *전역변수, 지역변수, 정적변수를 스택과 힙과 관련해사용.

지역변수 – 한정된 지역에서만 사용할수 있는 변수.(스택,지역변수와 매개변수 완료->소멸)

전역변수 – 한정된 지역이아닌 모든 지역에서 사용가능한 변수.(데이터영역)

정적변수 – 지역변수는 그 선언 블록을 지나면 값을잃음. 하지만잃지않게하는 것(데이터)

힙영역 – 동적할당(런타임 시, 프로그램실행되논동안 결정해야하는 경우)


  • *inner 클래스란? 왜쓰는가?

하나의 클래스로, 클래스나 인터페이스 내부에서 선언

읽기 쉽고, 오래 유지하기 위해.

이점 – 코드의 복잡성 줄임

내부클래스에서 외부클래스의 멤버들을 쉽게 접근.


  • *예외처리의 필요성과 목적?

예외 – 프로그램 코드에 의해서 수습될수 있는 미약한 오류.

필요성 – 프로그램의 비정상 종료를 막고, 정상적인 실행상태 유지.

목적 – 시스템의 개선(예외 상황에 대한 로그를 남기고, 인지하여 효율적으로 개선가능)


  • *JVM의 구성에 대하여 설명

구성 – 클래스 로더 – 컴파일된 자바 바이트 코드를 런타임 데이터영역에 로드

실행엔진 – 런타임 데이터 영역에 배치된 코드를 실행.

런타임 데이터 영역(메모리영역) -메소드(데이터),힙,스택


  • *자바의 장단점

#장점

- 하위호환

- 이식성 높은 언어 : 다른환경이라도 JRE가 실행되잇다면 가능.

- 객체지향언어 : 객체라는 부품을 만들어 부품끼리 연결하여 프로그램 작성

캡슐화, 상속, 추상화, 다형성

- 메모리의 효율적 관리 : 가비지 컬렉터

- 멀티스레드를 쉽게 구성 가능( 면접때 공격받기 쉬움, 예제 설명이나 구현경험 설명 필요 )

#단점

- 속도가 느림

JVM에 의해 기계어로 번역되고 실행됨. (<->)C나C++은 컴파일단계에서

- 예외처리불편

프로그래머 검사가 필요한 예외가 등장한다면 무조건 프로그래머가 선언.


  • *JDK, JVM, JRE 관계

1)JVM - 자바 소스코드(.java)로부터 만드러지는 바이너리 파일(.class)를 실행가능

픔랫폼에 의존적, 컴파일된 바이너리는 어떤 jvm에서도 사용가능(wora)

2)JRE(자바 런타임 환경) - jvm이 자바 프로그램을 동작시킬때 필요한 라이브러리 파일과 기타파일 가짐.

3)JDK - JRE + 개발을 위한 도구를 포함.

  • *기본형과 참조형의 차이점!(int와 Integer)

기본타입 – int, long, short, double, char, boolean

참조타입(Boxing, 랩퍼) – String, Integer, Long, Double, Boolean

#차이점

기본타입 – 리터럴, 소스 코드의 고정된 값, 상수나 변수에 할당가능값.

jvm내의 Stack메모리에 저장.

초기화 시, 0으로 초기화.

변수에 값이 있음.

참조타입 – jvm내의 Heap메모리에 저장(같은 값이라도 다른객체면 다르다식별)

초기화가 아니면 null이 가능(nullPointerExveption발생).

객체참조 정보를 바탕으로 Heap에서 찾음(시간 걸림).

의도치 않은 기본타입으로의 언박싱.

#언제써?

컬렉션 – 기본타입을 담을수 없음으로 박싱된 기본타입 사용.

제네릭 – 기본타입 지원 안하기 때문에 사용.

리플렉션 – 메서드를 호출할때도 박싱된 기본타입.


  • Call by value vs Call by reference

#요약

값을 복사를 하여 처리를 하는가? 아니면 직접 참조를 하느냐의 차이.

#Call by value

장점 : 복사하여 처리하기 때문에 원래의 값이 보존되어 안전.

단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.

#Call by reference

장점 : 복사하지 않고 직접 참조를 하기에 빠르다.

단점 : 직접 참조를 하기에 원래 값이 영향을 받는다(위험).

#자바는 Call by reference!!?

결론은 아니다.

자바에서는 사이드 이펙트를 막기 위해 Call by Value로 주고 받음.

Call by Reference가 필요한 경우에는 명시적으로 클래스 객체를 주고 받도록 정함

사이드 이펙트 - 다른 메소드에서 현재의 메소드 내의 변수값을 바꾸는 현상.

1)자바에서 인수로 기본 데이터 형을 사용하면 Call by Value

-> 메소드 내의 처리 결과는 메소드 밖의 변수에 영향 x

2)자바에서 인수로 클래스 객체를 인수로 전달하면 Call by Reference


  • Static 멤버와 Non-Static멤버

#Static 멤버

- 공간적 특성

멤버는 클래스당 하나가 생성.

멤버는 객체 내부가 아닌 별도의 공간에 생성(공유 됨).

클래스멤버라고 불림.

- 시간적 특성

객체가 생기기전에 이미 생성.

객체가 생기기 전에도 사용 가능.

객체가 사라져도 멤버는 사라지지 않는다.

멤버는 프로그램이 종료될때 사라짐.

동일한 클래스의 모든 객체들에 의해 공유

#Non-Static 멤버

- 공간적 특성

멤버는 객체마다 별도로 존재.

인스턴스 멤버라고 불림.

- 시간적 특성

객체가 생길 때 멤버도 생성.

객체가 생성 후 멤버 사용이 가능.

객체가 사라지면 멤버도 사라짐.

멤버는 객체 내에 각각의 공각을 유지.


  • Java의 '=='와 'Equals()'차이.

- Java '=='

  비교하고자하는 대상의 주소값을 비교

 

- Java 'Equals()'

  비교하고자하는 대상 내용 자체를 비교(객체끼리 내용 비교 가능)

  

  


  • ArrayList vs LinkedList 

#사용이유

초기에 길이를 지정하여 동적으로 변경할 수 없을 때

 

#ArrayList

내부적으로 데이터를 배열에서 관리하며 데이터의 추가, 삭제를 위해 임시배열을 생성해 데이터를 복사

-> 데이터의 복사가 많이 일어나 성능 저하(검색에는 유리함)

- 검색 : 인덱스기반이여서 O(1)

- 삭제 : 삽입, 삭제 이후 다른 데이터를 복사해야해서 최악의 경우 O(N)

 

#LinkedList

불필요한 데이터의 복사가 필요없고, 삭제시 노드를 통해 하기 때문에 유리.

데이터 검색에는 노드를 순회해야하기 때문에 불리.

- 검색 : 최악의 경우에는 모두 순회 O(N)

- 삭제 : 이전노드와 다음 노드의 참조 상태만 변경하면됨, O(1)

 

 


  • 클래스, 객체 , 인스턴스의 차이?

#클래스

- 객체를 만들어 내기 위한 '설계도' 혹은 '틀'

- 연관되어 있는 변수와 메소드의 집합

 

#객체

- '설계도로 구현한 모든 대상'

- '클래스의 인스턴스'라고도 불림.

- new()로 메모리 할당하기 전 선언까지.

 

#인스턴스

- 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적 실체.

- 자바에서는 실질적으로 new()를 통해 메모리가 할당 되었을 때.

 


  • 깊은복사와 얕은복사?

#얕은 복사

- 데이터를 복사하는 것이 아니라 주소값을 복사

- data1을 바꾸면 data2도 바뀜.

DATA data1 = data2 // 얕은 복사

 

#깊은 복사

- 자바의 데이터를 복사 하기 위해 복사기능을 넣어놓음.

- Cloneable 인터페이스를 상속해야 복사가 가능.

class DATA implements Cloneable { ... } // 인터페이스 상속 후, clone() 메소드 구현
//
@Override
protected Object clone() throws CloneNotSupportedException { ... }
//
DATA data1 = (DATA) data2.clone(); //깊은 복사

 


  • Enum을 왜 사용할까?

- Enum : Enumerated Type, '서로 연관된 상수 값들의 집합'

 

#장점

- 복잡한 값 -> 단순한 값(가독성, 단순)

  상수는 변하지 않는다는 특징을 이용 함.

- switch문에서 사용 가능한 Enum.

- Enum이라는 키워드로 열거형의 의도를 명확히 드러냄.(주석없이도 의미 파악)

- 인스턴스 생성과 상속을 방지합니다.

 


  • 코드영역, 데이터영역, 힙 메모리 영역과 스택 메모리 영역

구분 설명
코드 영역
(Code Area)
코드 영역은 이름 그대로 실행할 프로그램 코드가 저장되는 메모리 공간입니다.
CPU는 코드영역에 저장된 명령문들을 하나씩 가져가서 실행합니다.
데이터 영역
(Data Area)
전역변수와 static 변수가 할당되는 공간입니다.
이 영역의 변수들은 프로그램의 시작과 동시에 메모리 공간에 할당되며 프로그램 종료시 까지 남아있는 특징을 가집니다.
힙 영역
(Heap Area)
데이터 영역과 스택영역에 할당되는 변수들은 생성과 소멸 시점이 이미 결정되어 있습니다.
힙 영역은 프로그램 실행중에 프로그래머가 원하는 시점에 변수를 할당하고, 소멸하는 공간입니다.
스택 영역
(Stack Area)
지역변수와 매개변수가 할당되는 공간입니다.
이 영역의 할당되는 변수들은 선언된 함수가 종료되면 소멸되는 특징이 있습니다.

  • String, StringBuffer, StringBuilder

#String

- 불변 객체, 프로그래밍 시 인스턴스 생성

  조회가 많은환경, 멀티쓰레드 환경에서 성능적 유리.

 

#StringBuffer클래스, StringBuffer클래스

- 문자열 연산이 자주 발생, 문자열이 변경가능

- 차이점 : 동기화 지원의 유무

  StringBuffer : 동기화가 필요한 멀티쓰레드 환경에서는 StringBuffer를 사용하는것이 유리.

  StringBuilder : 동기화를 고려하지 않는 환경에서 좋고.

 


  • 업캐스팅, 다운캐스팅?

#업캐스팅(자동적)

- 서브클래스 -> 슈퍼클래스 타입으로 형변환 된것.

- 객체내의 모든멤버(변수,메소드)에 접근할 수 없고, 슈퍼클래스의 멤버에만 접근이 가능.

- 서브클래스 객체는 수퍼클래스로 취급되며 모든 특성을 상속받음.

- 하는 이유?

  다형성에 관련이 있음(같은 명령이지만, 타입에 따라 다르게 행동을 하게 해줌)

  업캐스팅 없이, 자식 크래스를 통해서 메서드를 호출시, 자식이 어떤타입인지 일일이 판별.

 

#다운캐스팅(명시적)

- 자신의 고유한 특성을 잃은 서브 클래스의 객체를 다시 복구 시켜주는 것.

 -> 업캐스팅된 것을 다시 원상태로 돌리는 것.

- 업캐스팅과 다른 점은, 명시적으로 타입을 지정해야 한다는것.

 

#instance of

- 연산의 결과 타입은 boolean

- 객체의 타입을 쉽게 구별 가능.

- 원시형은 불가능(참조형 타입에만 가능)

 


  • 자바의 리플렉션 API를 이해하시나요?

#정의

리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 하는 Java API.

  -> 구체적인 클래스 타입을 알지 못하면 메소드를 실행할수 없다.

 

#응용

- 인텔리제이의 자동완성, 스프링 프레임워크의 어노테이션 같은 기능과 같은 메커니즘.

  -> 사용될 클래스가 어떤 타입인지는 모르지만 리플렉션을 이용해서 코드를 일단 작성. 

 


  • 동기화 방법 3가지?

[1] synchronized 키워드

 1) synchronized 메서드(메서드 자체에 해당 키워드를 활용)

  public synchronized void print(){ .. }

- 한 스레드가 print() 동기화 메서드를 실행하면서 lock을 건다.

- 여기서 중요한 것은, 메서드 자체에만 lock을 거는것이 아닌, 해당 동기화메소드를 호출한 객체 자체에 lock.

 

 2) synchronized 블럭(메서드 내부에 동기화가 필요한 로직에만 감싸는 형태)

synchronized(this) { ... }

 메서드 내부의 특정 로직에 대해서만 동기화를 적용.

 

[2] volatile 키워드 (발리를)

volatile 키워드로 선언된 변수는 Main Memory에 저장됨.

보통 변수에 read/write를 하게되면 CPU Cache까지만 보고 작업을 진행하지만, 이를 Main Memory까지 확장.

public volatile int counter = 0;

스레드1과 스레드2가 같은 변수 값을 read/write할 경우 값의 불일치 발생.

-> CPU Cache가 아닌 Main Memory에 변수의 값을 read/write할 경우 변수 값의 동기화 문제가 해결.

 

[3] Atomic Type

Atomic은 CAS(Compare And Swap)방식에 기반하여 동기화 문제를 해결한다.

CAS란 변수가 기존에 가지고 있던 값이 내가 예상하는 값과 일치하는 경우에만 새로운 값을 할당.

public class AtomicDemo
{
   private int val;
   public boolean compareAndSwap(int oldVal, int newVal) {
      if(val == oldVal) { val = newVal;
      return true;
}
return false;
   }
}

간단히, 값을 변경하기 전에 한번 더 확인 해주는 것.

Atomic Type은 이러한 CAS를 하드웨어(CPU)의 도움을 받아 한번에 단하나의 스레드만 변수값을 변경할 수 있음.

 

#종류

AtomicBoolean과 AtomicInteger가 있음.

 


  • final과 static final?

[1]final

java에서 final 키워드는 상수나 메소드,클래스를 정의 한 뒤 변경하지 못하게 할때 사용.

 1) 상수 정의에 사용.

final int a;

 2) 메서드에 사용.

 오버라이딩(재정의)를 못하게 만듬.

public final void test2(){ ... }

 3) 클래스에 사용

 상속을 못하게 만듬.

final class Test { ... }

 

[2]static

클래스 멤버(정적)를 선언할 때, 사용하는 키워드.

 

[3]static final

static은 클래스 변수, static final은 객체(인스턴스)가아닌 클래스에 존재하는 단 하나의 상수.

-> 선언과 동시에 초기화 해주어야하는 클래스 상수.

public class test{
   static final int a = 1; // 선언과 동시에 초기화
}

  • 컴파일 에러, 런타임 에러 차이

[1] 컴파일타임 에러

- 컴파일 시 발생하는 에러.

컴파일 : 소스코드를 기계어로 번역하는 과정.

- 대체로 구문, 문법상의 에러.

- 에러가 발생하는 부분을 알려줌

';'이 누락된 문법에러 (syntax 오류 )
괄호가 안맞는 등의 구문 에러
classpath에 누락 된 클래스(컴파일시)

클래스 패스 : 클래스를 찾기위한 경로, JVM이 프로그램을 실행시, 클래스파일을 찾는데 기준되는 파일경로.

 

[2] 런타임 에러

- 실행 시 발생하는 에러

- 프로그램이 컴파일 된 후 실행하면서 에러 발생

- 대체로 개발 시 설계 미숙(논리적) 에러

- 에러 발생시 프로그래머가 역추적해서 원인 확인.

NullPointerException
무한 루프
0으로 나누는 경우

  • iterator 정리.

자바의 컬렉션 프레임웤에서 컬렉션이 저장되어 있는 요소들을 읽어오는 방법을 표준화 한것중 하나.

다시 말해서 인터페이스.

public interface Iterator {
   boolean hasNext();
   Object next();
   void remove();
}

1) hasNext() : 읽어올 요소가 남아 있는지 확인하는 메소드.

2) next() : 읽어올 요소를 읽어 객체로 반환하는 메소드.

3) remove() : next()로 읽어온 요소를 삭제함.

ArrayList<Integer> list = new ArrayList<Integer>();

Iterator<Integer> itr = list.iterator();

while( itr.hasNext() ){
   list.get( itr.next() );
}

  • 자바 소켓클래스 동기? 비동기?

정의 : 클라이언트 측의 TCP 기능을 수행하기 위한 자바의 기본 클래스.

생성자 : 연결할 호스트와 포트를 매개변수로 전달받음.

public Socket(String host, int port)
public ServerSocket(int port, int backlog, InetAddress bindAddr); // 포트, 대기큐, 바인드 주소

#소켓 송수신

 

#송수신

1) InputStream : 소켓의 입력 스트림.

2) OutputStream : 소켓의 출력 스트림.

 

[1] 동기 소켓

정의 : 동기 소켓은 소켓서버에서 클라이언트의 요청이 올때까지 요청을 기다림.

연결되면 지속적으로 주고 받음.

 

#문제점

클라이언트의 소켓에서 요청이 올때까지 서버는 대기

Socket socket = serverSocket.accpet(); // 이코드에 진입하면 소켓이 연결되기 기다림.

 

#장점

비교적 간단하게 소켓서버 구성.

눈에 보이는대로 프로그램의 흐름이 진행.

 

#개량

동시접속 문제가 남아 있음.

-> 스레드 풀을 이용하여 블럭이되더라도 다중 소켓처리 가능

-> 접속자가 증가하거나 요청횟수가 증가하면서 스레드 늘어나면 서버자원 많이 소모.

 

[2] 비동기 소켓

정의 : 보통 소켓은 accept를 실행하면 Block이 됨.(접속기다리며 대기)

  그래서 Thread에 Stream을 넣어서 accept의 block을 피하는 것.

  -> 클라이언트 접속단위로 스레드를 생성하는것이 없어져 성능 올라감.

 

블록킹(blocking) vs 논블록킹(non-blocking)

일반적으로 블록킹 모드는 특정 구간에서 프로그램이 멈춰있거나 대기하고 있는 것을 말합니다. 위의 예제 코드처럼 accept() 메소드나 또는 소켓 스트림의 read() 메소드에서 해당 스레드는 블럭(block)이 됩니다. 블럭이 된다는 것은 프로그램 플로우가 잠시 멈춰선다는 것이죠.

논블록킹 모드에서는 대기하지 않고 바로 결과를 넘겨줍니다. 이말인즉슨 프로그램은 멈추지 않고 계속적인 피드백을 주고 받는것이죠. 자바에서는 논블록킹을 위한 별도의 클래스들이 준비 되어 있습니다. NIO(NonblockingIO)라 불리는 API 집합입니다. 

 


  • 정규표현식?

정의 : 특정한 문자열의 집합을 표현하기 위해 쓰이는 형식언어.
언제사용? : 전화번호,주민등록번호,이메일등의 입력이 올바른지 검증이 쉬움.

 

+) 한글은 -|-|-힣 으로!

 

public class 낙서 {

    public static Scanner sc = new Scanner(System.in);
    public static void main(String args[]) {
        String pattern = "^[0-9]*$";
        String val = sc.next();

        boolean regex = Pattern.matches(pattern, val);
        System.out.println(regex);
        //1234 - true
        //asdf2 - false
    }

}

 

#좀더 많은 내용 링크

https://coding-factory.tistory.com/529?category=758267

 

'CS' 카테고리의 다른 글

디자인 패턴  (0) 2020.02.18
ETC  (0) 2020.02.11
네트워크  (0) 2020.02.11
운영체제  (0) 2020.02.11
데이터베이스  (0) 2020.02.11