728x90

TCP/IP 프로토콜

  • TCP : Transmission Control Protocol
    - 두 시스템 간에 신뢰성 있는 데이터의 전송을 관장하는 프로토콜
  • IP : Internet Protocol
    - 패킷 교환 네트워크에서 호스트간 데이터를 주고 받는 것을 관장하는 프로토콜

cf. OSI 7계층 관련 글
cf. TCP vs UDP 관련 글
cf. IP주소, 포트 번호, URL 관련 글

자바의 URL 클래스

  • java.net 패키지에 포함

URL 객체 생성 방법

  1. 절대 경로로 URL 객체 생성
URL myGithub = new URL("https://github.com/ruthetum");
  1. 상대 경로로 URL 객체 생성
URL repo = new URL(myGithub, "speech-to-text-icampus");
// repo 객체가 담은 URL은 https://github.com/ruthetum/speech-to-text-icampus
  • 잘못된 주소의 URL을 입력할 경우 MalformedURLException 예외 발생

예제 : URL 주소에서 데이터(html) 읽기

public static void main(String[] args) {
        URL myGithub = null;
        try {
            myGithub = new URL("https://github.com/ruthetum");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(myGithub.openStream()));

            String html;
            while ((html = bufferedReader.readLine()) != null) {  // 한 줄씩 읽기
                System.out.println(html);
            }
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

URLConnection 클래스

  • 주어진 원격지의 주소 URL에 네트워크 접속 후 데이터를 보내거나 받을 수 있도록 하는 기능
  • 단순히 url에 접속하는 것도 가능하지만 파라미터를 설정해서 값을 넣어줄 수도 있음
  • 자바로 크롤링을 할 경우 Jsoup 패키지를 참고하자
URL url = new URL("https://github.com/ruthetum");
URLConnection conn = url.openConnection();

서버에 데이터를 보내기 위한 단계

  • 자바 프로그램이 웹 서버에 데이터를 보내기 위해 필요한 단계
  1. URL 생성
  2. URL 객체에서 URLConnection 객체를 얻어옴
  3. setDoOutput() 메소드로 doOutput 필드를 true로 설정
  4. connect() 메소드로 연결 설정
  5. 연결에서 출력 스트림을 얻음
  6. 출력 스트림에서 데이터를 출력
  7. 출력 스트림을 close() 메소드로 닫음

소켓 프로그래밍

Socket(소켓)

  • 네트워크 상에서 수행되는 두 프로그램 간의 양방향 통신 링크의 끝 단을 의미
  • 소켓은 특정 포트 번호와 연결되어 있음
  • 자바에서 데이터 통신 시 소켓 사용
  • 서버 소켓, 클라이언트 소켓으로 구성

ServerSocket 클래스

  • 서버 소켓에 사용되는 클래스
  • java.net 패키지에 포함
  • 주요 생성자
  • 주요 메소드
  • 예제 코드
// 서버 소켓 생성
ServerSocket server = new ServerSocket(5000);
// 클라이언트 접속 대기
Socket socket = server.accept();
// 네트워크 입출력 스트림 생성
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter((new OutputStreamWriter(socket.getOutputStream()));
// 클라이언트로부터 데이터 수신
String line = in.readline(); // 한 행 수신
// 클라이언트에게 데이터 전송
out.write("Hello, Client\n");
out.flush();
// 네트워크 접속 종료
socket.close();
// 서버 종료
server.close();
  • flush를 호출하면 스트림 속에 데이터를 남기지 않고 모두 전송

Socket 클래스

  • 클라이언트 소켓에 사용되는 클래스
  • java.net 패키지에 포함
  • 주요 생성자
  • 주요 메소드
  • 예제 코드
// 클라이언트 소켓 생성
Socket client = new Socket("128.12.1.1", 5000);
// 네트워크 입출력 스트림 생성
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter out = new BufferedWriter((new OutputStreamWriter(client.getOutputStream()));
// 서버로 데이터 전송
out.write("hello\n");
out.flush;
// 접속 종료
client.close();

예제 : 채팅 프로그램 만들기

이미지 출처 : 명품 JAVA 프로그래밍 (황기태, 김효수 저)

728x90

'Java > Java 기본' 카테고리의 다른 글

[JAVA] 입출력 스트림과 파일 입출력  (0) 2022.12.26
[JAVA] 제네릭과 컬렉션  (0) 2022.12.26
[JAVA] 상속  (0) 2022.12.26
728x90

자바의 스트림(Stream)

  • 자바 스트림은 입출력 장치와 자바 응용 프로그램 연결
  • 입력 스트림 : 입력 장치 -> 자바 프로그램
  • 출력 스트림 : 자바 프로그램 -> 입력 장치
  • 입출력 스트림 기본 단위 : 바이트
  • 바이트 입출력 스트림 : 단순 바이트 스트림 처리 (Ex. binary 파일)
  • 문자 입출력 스트림 : 문자만 입출력하는 스트림 (Ex. txt 파일)

바이트 스트림

1. FileInputStream

  • 파일 읽기
FileInputStream fin = new FileInputStream("c:\\test.txt");
int c;
while((c = fin.read()) != -1) {  // 파일의 끝을 만나면 -1 return
    System.out.print((char)c); 
}

2. FileOutputStream

  • 파일 쓰기
FileOutputStream fos = new FileOutputStream("c:\\test.out");
int num[]={1,4,-1,88,50};
byte b[]={7,51,3,4,1,24};
for(int i=0; i<num.length; i++) {
    fos.write(num[i]);
}
fos.write(b); 
fos.close();

문자 스트림

  • 유니코드로 된 문자를 입출력하는 스트림
  • Reader / Writer
  • InputStreamReader / OutputStreamWriter : 바이트 스트림과 문자 스트림을 연결
  • FileReader / FileWriter : 텍스트 파일에서 문자 데이터 입출력

1. FileReader

  • 텍스트 파일 읽어 오기
FileReader fileReader;
try {
    fileReader = new FileReader("c:\\windows\\system.ini");
    int c;
    while ((c = fileReader.read()) != -1) {  // 한 문자씩 읽음
        System.out.print((char) c);
    }
    fileReader.close();
} catch (IOException e) {
    e.printStackTrace();
}

2. InputStreamReader

  • 한글 텍스트 파일 읽어 오기
InputStreamReader inputStreamReader;
FileInputStream fileInputStream;

try {
    fileInputStream = new FileInputStream("c:\\Users\\Dell\\Desktop\\test.txt");
    inputStreamReader = new InputStreamReader(fileInputStream);

    int c;
    while ((c = inputStreamReader.read()) != -1) {
        System.out.print((char) c);
    }

    inputStreamReader.close();
    fileInputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

3. FileWriter

  • 텍스트 파일에 키보드로 입력한 값 저장하기
Scanner sc = new Scanner(System.in);
FileWriter fileWriter;
int c;

try {
    fileWriter = new FileWriter("c:\\Users\\Dell\\Desktop\\test.txt");
    String line = sc.nextLine();
    fileWriter.write(line);
    sc.close();
    fileWriter.close();
} catch (IOException e) {
    e.printStackTrace();
}
728x90

'Java > Java 기본' 카테고리의 다른 글

[JAVA] 네트워크  (0) 2022.12.26
[JAVA] 제네릭과 컬렉션  (0) 2022.12.26
[JAVA] 상속  (0) 2022.12.26
728x90

컬렉션

  • 요소(element)라고 불리는 가변 개수의 객체들의 저장소
  • 객체들의 컨테이너라고도 불림
  • 고정 크기의 배열을 다루는 어려움 해소
  • 다양한 객체를 삽입, 삭제 검색 할 수 있음
  • 컬렉션은 제네릭 기법으로 구현됨

제네릭

  • 특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 클래스나 메서드를 일반화시키는 기법
Vector<E>	// 제네릭 벡터
Vector<Integer>	// 정수만 다루는 벡터
Vector<Stirng> // 문자열만 다루는 벡터

ArrayList<E>

  • 가변 크기의 배열
ArrayList<Integer> = new ArrayList<>();

ArrayList 주요 메서드

Iterator<E>

  • 컬렉션의 순차 검색에 이용

Iterator 주요 메서드

  • iterator() 메서드
    • 메서드를 호출하면 Iterator 객체 반환
    • Iterator 객체를 이용하여 index 없이 순차 검색 가능
Iterator<Integer> it = al.iterator();
while(it.hasNext()) {
	int n = it.next();
  	System.out.println(n);
}
Iterator 개념을 접했다면 for, while과 같은 반복문과 비교했을 때 속도 비교에 관하여 궁금증이 생길 수 있다.
해당 내용과 관련해서 잘 정리된 포스트가 있어 링크를 남긴다.
반복문 속도 비교 링크: https://3colored.tistory.com/5

HashMap<E>

  • 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
  • 주요 메서드
    - put() : 요소 삽입
    - get() : 요소 검색 (값 접근의 경우 키를 이용)

LinkedList<E>

  • ArrayList 클래스와 유사하게 작동
  • element 객체들은 양방향으로 연결되어 관리
  • element 객체는 맨 앞, 맨 뒤 또는 인덱스를 이용하여 중간에 삽입 가능
  • 스택이나 큐로 사용 가능

Collections 클래스

  • 컬렉션에 대해 연산 수행, 결과로 컬렉션 return
  • 모든 메서드는 static 타입
  • 주요 메서드
    - sort() : 정렬
    - reverse() : element의 순서를 반대로
    - max(), min() : 최댓값, 최솟값
    - binarySearch() : 특정 값 검색

제네릭 객체 생성 - 구체화

  • 타입 매개 변수에 기본 타입은 사용할 수 없음 (Ex. int)

이미지 출처 : 명품 JAVA 프로그래밍 (황기태, 김효수 저)

728x90

'Java > Java 기본' 카테고리의 다른 글

[JAVA] 네트워크  (0) 2022.12.26
[JAVA] 입출력 스트림과 파일 입출력  (0) 2022.12.26
[JAVA] 상속  (0) 2022.12.26
728x90

상속(Inheritance)

  • 상위 클래스의 특성을 하위 클래스에 물려주는 것 (Ex. 자동차 -> 스포츠카 )
  • superclass : 특성을 물려주는 상위 클래스
  • subclass : 특성을 물려받는 하위클래스
public class Car {
    ...
}

public class SportsCar extends Car {
    ...
}

public class Lamborghini extends SportsCar {
    ...
}

자바 상속

  • 클래스를 다중 상속 지원하지 않음 (cf. Python)
  • 상속 횟수는 무제한
  • 최상위 클래스는 java.lang.Object

슈퍼 클래스와 서브 클래스

  • 서브 클래스의 객체에는 슈퍼 클래스가 멤버가 포함
    • 슈퍼 클래스의 private 멤버는 상속되지만 서브 클래스에서 직접 접근 불가
    • 슈퍼 클래스 내의 public 또는 protected 메서드를 통해 접근 가능

캐스팅

  • 업캐스팅(upcasting) : 서브 클래스의 레퍼런스 값을 슈퍼 클래스 레퍼런스에 대입
    • 슈퍼 클래스의 멤버만 접근 가능
  • 다운캐스팅(downcasting) : 슈퍼 클래스 레퍼런스를 서브 클래스 레퍼런스에 대입
    • 업캐스팅된 것을 다시 원래대로 되돌림
  • instanceof
    • 업캐스팅된 레퍼런스는 객체의 진짜 타입을 구분하기 어려움
    • instanceof 연산자를 통해 객체의 진짜 타입 식별
    • true/false로 값 return
class Person {
    ...
}

class Student extends Person{
    ...
}

public static void main(String[] args) {
    Person p = new Student();   // upcasting
    Student s;
    s = (Student) p;    // downcasting
    if (p instanceof Person)    // true
    if (p instanceof Student)   // false
    if (s instanceof Person)    // false
    if (s instanceof Student)   // true
}

메서드 오버라이딩 (Method Overriding)

  •  슈퍼 클래스의 메소드를 서브 클래스에서 재정의
  • 메소드 이름, 인자, 타입, 개수, 리턴 타입 등을 모두 동일하게 작성
  • static, private, final 메서드는 오버라이딩 불가
class Person {
    String name;
    ...
    void info() {
        System.out.println("사람 : " + this.name);
    }
}

class Student extends Person{
    void info() {
        System.out.println("학생 : " + this.name); // Overriding
    }
}

 

오버라이딩과 오버로딩을 혼동하지 말자

Overriding vs Overloading

추상 메소드 (abstract method)

  • 선언되어 있으나 구현되어 있지 않은 메서드
  • abstract 키워드로 선언 (Ex. public abstract int getValue();)
  • 서브 클래스에서 오버라이딩해서 구현

추상 클래스 (abstract class)

  • 추상 메서드를 하나라도 가진 가진 클래스 or 클래스 앞에 abstract로 선언한 클래스
  • 추상 클래스는 인스턴스를 생성할 수 없다.
abstract class Person {
    public String name;
    abstract public void walk();
}

추상 클래스의 용도

  • 설계와 구현 분리
  • 서브 클래스마다 목적에 맞게 추상 메소드를 다르게 구현

인터페이스 (inferface)

  • 모든 메서드가 추상 메서드인 클래스
  • 인터페이스는 상수와 추상 메서드로만 구성, 변수 필드 선언 불가
  • 객체 생성 불가, 레퍼런스 변수는 선언 가능
  • interface 키워드로 선언 (Ex. public interface Driver{})
public interface Car {
    int MAX_SPEED = 300;    // static fianl 생략, 상수 필드 선언
    int drive(int speed);   // abstract public 생략, 추상 메소드 선언
}

new Car();  // Error : inferface는 객체 생성 불가
Car car;    // 레퍼펀스 변수는 선언 가능

인터페이스 다중 구현

  • 인터페이스를 이용하여 다중 상속 구현 가능
inferface USBModule {
    void connectUSB();
}

inferface PrintModule{
    void setColor();
    void printAll();
}

public class PrintDriver implements USBModule, PrintModule {
    void connectUSB() {...};
    void setColor() {...};
    void printAll() {...};
    
    // 추가적으로 다른 메소드 작성 가능
    boolean getState() {...}
}

 

 

이미지 출처 : 명품 JAVA 프로그래밍 (황기태, 김효수 )

728x90

'Java > Java 기본' 카테고리의 다른 글

[JAVA] 네트워크  (0) 2022.12.26
[JAVA] 입출력 스트림과 파일 입출력  (0) 2022.12.26
[JAVA] 제네릭과 컬렉션  (0) 2022.12.26

+ Recent posts