[Java] 개인 공부용 초간단 문법정리(2/2)

초보개발자
9 min readNov 11, 2020

--

  • 인프런의 ‘자바 프로그래밍 입문 강좌 (renew ver.) — 초보부터 개발자 취업까지!!’강의를 수강하며 정리한 내용입니다.
  • 정보 제공이 아닌 정리를 위한 글이라 불친절 할 수 있습니다.
  • 개인의 지식 Indexing 용도로 작성된 글입니다.

인터페이스

클래스의 명세서 역할을 하며 선언만 해두고 정의는 구현할 클래스에서 진행한다.

여러 개의 인터페이스를 하나의 클래스에서 구현 가능(다형성)

ex)

public interface InterfaceA {

}

public interface InterfaceB {

}

public class InterfaceClass implements InterfaceA, InterfaceB {

}

InterfaceA ia = new InferfaceClass();

InterfaceB ib = new InferfaceClass();

.

한 개의 인터페이스를 여러 클래스에서 구현 가능

ex)

public interface Toy {

}

public class ToyRobot implements Toy {

}

public class ToyAirplane implements Toy {

}

Toy toyRobot = new ToyRobot();

Toy toyAirplane = new ToyAirplane();

이때 toyRobot, toyAirplane은 서로 다른 클래스의 객체를 레퍼런스하고 있지만 같은 인터페이스를 기반으로 구현됐기 때문에 Toy라는 동일한 데이터로 취급되어 같은 배열에 담길 수 있음.

ex) Toy[] toys = {toyRobot, toyAirplane};

추상클래스

추상클래스 — ‘AbstractClass’(public뒤의 ‘abstract’키워드에 주목)

public abstract class AbstractClass {

……public abstract void funA();

}

//속성, 메서드 가질 수 있다 -> 인터페이스랑 다른 점

//다만 메서드 앞에 ‘abstract’가 붙으면 인터페이스처럼 선언만 할 수 있는 메서드가 되버림

.

상속받는 클래스 — ‘ChildClass’

public class ChildClass extends AbstractClass {

……@Override

……public void funA() {

……//ChildClass가 추상 클래스인 AbstractClass를 상속했기에 funA함수를 재정의(overriding)해야함. (funA함수는 abstract함수이므로)

……}

}

인터페이스, 추상클래스

공통점:

인스턴스화 불가능(레퍼런스 형태로만 사용가능), 추상메서드를 가진다(인터페이스는 ‘abstract’ 키워드 필요없고 추상클래스에서는 필요함)

.

차이점:

1.인터페이스는 상수, 추상메서드를 가지고 추상클래스는 일반클래스처럼 메서드, 속성을 다 가질 수 있다.

2.인터페이스는 다중으로 implements하는 것이 가능하지만 추상클래스는 상속의 형식이기 때문에 단일 상속만 가능하다.(extends 뒤에 하나의 추상클래스만 와야함)

람다식

interface에서 함수선언만 해두고

그 선언된 함수를 다른 클래스의 호출부에서 그때그때 조작해서 사용한다.

이때 리턴 값의 유무, 매개변수의 유무, 갯수, 데이터타입등이 활용에 변화를 준다.

이로인해 객체 형식으로 모든 걸 갖춰놓고 코딩하지 않고 즉석으로 람다로 식을 만들어 쓰는 스타일이 가능해질듯

문자열 클래스

String은 많이 쓰이지만 약간의 성능저하 요소가 있다.(체감 불가능한 수준, 일반적으론 상관없음)

그래서 StringBuffer, StringBuilder를 사용하기도 한다.

String

>String형 객체는 값이 갱신될때마다 레퍼런스가 새로운 동적 String 객체를 만들기 때문에 기존 데이터를 재활용하지 않는다. 그리고 기존의 객체는 GC에 의해 소멸된다.

.

StringBuffer

관련함수: insert, lenth, delete, append

>안전성 up

.

StringBuilder

>속도 up

Collections(자료형)

자료형에 따라 내부의 데이터를 다루는 방식이 다르다.

그러므로 구현할 시스템의 특징을 고려하여 자료형을 선정해야한다.

Java에서도 여러 자료형(Collection)을 지원한다. 여기서는 대표적으로 많이 쓰는 List 계열의 ArrayList와 Map 계열의 HashMap을 다룬다.

List계열

List자체는 Interface이며

ArrayList, LinkedList, Vector 클래스가 이를 구현한 클래스이다.

특징은 인덱스 기준으로 데이터를 다룬다는 것

ArrayList<String> al = new ArrayList<String>();

*위는 선언 방법, <>안에는 ArrayList로 다룰 데이터타입을 명시한다.

아래는 ArrayList의 대표적인 함수(나머지는 공식문서에서 참고해야겠다)

1. al.add(‘string’) -> 뒤에서부터 데이터 추가

2. al.add(index_#, ‘stirng’) -> index_#에 해당하는 인덱스에 데이터 추가하고 기존 데이터는 뒤로 밀림

3. al.set(index_# , ‘string) -> index_#에 해당하는 인덱스에 데이터 추가하고 기존 데이터는 덮어씌어짐

4. al.remove(index_#) -> index_#에 해당하는 인덱스에 위치한 데이터 반환하고 삭제(pop과 비슷)

5. al.get(index_#) -> index_#에 해당하는 인덱스에 위치한 데이터 반환

6. al.clear() -> ArrayList 내의 모든 데이터 삭제

7. al.size() -> ArrayList 내의 데이터 갯수 반환

8. al.isEmpty() -> ArrayList 내의 데이터 존재 여부를 true, false반환

.

Map형 계열

Map 자체는 Interface이며

HashMap이 대표적인 Map을 구현한 클래스이다.

특징은 키를 기준으로 데이터를 다룬다는 것

HashMap<Integer, String> hm = new HashMap<Integer, String>();

*위는 선언 방법, <>안에는 순서대로 HashMap의 key, value 타입을 명시한다.

아래는 HashMap의 대표적인 함수(나머지는 공식문서를 참고해야겠다)

1. hm.put(key, value) -> 경우1(입력된 key가 HashMap에 존재하지 않음) HashMap에 입력받은 key와 value를 짝지어 저장한다. 경우2(입력된 key가 HashMap에 존재함) 기존 key의 value를 입력받은 value로 갱신한다.

2. hm.size() -> hm에 key,value가 몇 쌍인지 반환

3. hm.get(key) -> HashMap안에서 key에 해당하는 value를 반환

4. hm.remove(key) -> HashMap안에서 key에 해당하는 key, value 세트가 삭제됨

5. hm.containsKey(key) -> HashMap안에 입력받은 key 값과 같은 key가 존재하는지의 여부를 true or false로 반환

6. hm.containsValue(value) -> HashMap안에 입력받은 value 값과 같은 value가 존재하는지의 여부를 true or false로 반환

7. hm.clear() -> HashMap안의 모든 key-value 세트를 삭제

8. hm.isEmpty() -> HashMap안이 비었는지 여부를 true, false로 반환

예외처리

예기치 못한 문제로 시스템 동작이 멈추는 것을 방지하는 것

예기치 못한 문제: 예외, 시스템 동작 멈춤 방지: 예외처리

관련 Class로 Exception이 있는데 대표적인 하위 클래스로

NullPointerException

ArrayIndexOutOfBoundException

NumberFormatException

등이 있다.

각각 순서대로

객체를 가리키지 않는 레퍼런스를 가지고 함수 사용이나 멤버변수등에 접근하려 할 때

특정 배열이 다루는 범위를 벗어난 인덱스에 접근하려 할 때

숫자데이터에 문자데이터를 입력할 때

발생한다.

예외처리 구현 방법에는 (try catch), throws방법이 존재한다.

try {

//실행될 코드 구문

} catch (Exception e){

//예외처리 구문

} finally {

//예외처리 여부와 관계없이 반드시 실행되는 구문

}

throws: 예외발생시 직접 처리하지 않고 예외가 발생한 곳의 상위부로 그 예외를 던진다.

입력과 출력

Java에서 데이터 입출력은 Stream이라는 일종의 빨대를 이용해서 진행한다.

Stream은 InputStream과 OutputStream이 있는데 각각 추상클래스로써 하위의 자식 클래스인 FileInputStream, FileOutputStream, DataInputStream, DataOutputStream 등이 존재한다.

목적에 맞게 클래스를 고르고 각 클래스에서 객체를 생성해 데이터 입출력을 진행한다.

Stream 객체 이용시 try catch문 같은 예외처리는 필수이며 하지 않으면 컴파일 에러가 발생한다.

try catch문의 finally 구문에서는 사용한 Stream객체에 close() 함수를 호출해주어야한다.

네트워킹

네트워크 환경에서 통신을 하려면 우선 클라이언트와 서버 측 모두 socket을 통해 연결되어야한다.(java에서는 socket 클래스를 지원하므로 인스턴스화해서 사용가능)

클라이언트(보내는 측)가 server측의 ip주소, port번호를 토대로 클라이언트측 socket 객체를 통해 서버측과의 연결을 시도하면 서버측에서 server socket 객체로 accept함수를 호출하여 서버측 socket 객체를 생성한다. 클라이언트측과 막 생성된 서버측, 두 socket을 통해 연결이 이뤄진다.

이후에 클라이언트와 서버는 InputDataStream, OuputDataStream 객체를 통해 데이터를 송수신한다.

참고 강의

--

--

No responses yet