포스코DX X 비트교육센터 6기 - io, 네트워크


제너릭

  • 사용 이유 : 제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있기 때문
ArrayList list = new ArrayList(); //제네릭을 사용하지 않을경우
list.add("test");
String temp = (String) list.get(0); //타입변환이 필요함
        
ArrayList<String> list2 = new ArrayList(); //제네릭을 사용할 경우
list2.add("test");
temp = list2.get(0); //타입변환이 필요없음
  • 제너릭 타입이란?

제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말합니다. 제네릭 타입은 클래스 또는 인터페이스 이름 뒤에 < > 부호가 붙고 사이에 타입 파라미터가 위치합니다.

public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

image

자바의 제너릭 vs 타입스크립트의 타입 지정

자바의 제너릭과 타입스크립트의 타입 지정은 비슷한 개념이지만, 몇 가지 차이점이 있습니다. 먼저 각각의 개념을 간단히 설명하겠습니다.

자바의 제너릭(Generic in Java):
자바의 제너릭은 클래스나 메서드에서 사용할 타입을 미리 지정하지 않고, 나중에 실제 사용될 때 타입을 지정하는 방법입니다.
이는 코드의 재사용성과 타입 안정성을 향상시키는 데 도움을 줍니다.
제너릭을 사용하면 클래스나 메서드 내부에서 특정 타입을 사용하지 않고, 여러 다른 타입에 대해 작동할 수 있도록 만들 수 있습니다.

타입스크립트의 타입 지정(Type Annotation in TypeScript):
타입스크립트는 자바스크립트의 상위 집합으로서, 정적 타입을 지원하는 언어입니다.
타입스크립트에서는 변수, 함수 매개변수, 함수 반환값 등에 대한 타입을 명시적으로 지정할 수 있습니다.
이를 통해 개발자는 코드 작성 중에 발생할 수 있는 타입 관련 오류를 미리 방지하거나 줄일 수 있습니다.

비교해보면, 자바의 제너릭은 런타임 시에 타입 소거(Type Erasure)가 발생하여 컴파일 시에 타입 정보만을 체크하고
런타임에서는 타입 정보가 없는 제너릭 타입을 사용합니다.
반면에 타입스크립트는 정적 타입을 가지며, 컴파일 시에 타입 정보를 유지하여 타입 관련 에러를 더욱 철저하게 검출할 수 있습니다.

따라서 자바의 제너릭과 타입스크립트의 타입 지정은 비슷한 목적을 가지고 있지만,
내부적인 작동 방식과 타입 관련 오류를 다루는 방식에서 차이가 있습니다.
  • 제너릭 인터페이스
interface ExInterfaceGeneric<T> {
    T example();
}

class ExGeneric implements ExInterfaceGeneric<String> {

    @Override
    public String example() {
        return null;
    }
}

가변 파라미터

public int sum(Integer... nums){
        int s = 0;
        for(Integer i : nums) {
                s+=i;
        }
        return s;
}

public <T> void println(T... ts){
        for(T t: ts) {
                sysout(t);
        }
}


제작할 Program

  1. KeyboardTest
  2. PhoneList
  3. Chat c/s
  4. WebServer

주스트림

  • 키보드 연결 : System.in -> NullINputStream
  • 파일 연결 : FileInputStream
  • 소켓 연결 : SocketOutputStream / SocketInputStream

보조스트림

  • Buffered Reader
  • InputStreamReader

byte로 되어있는 것을 char로 바꾸고 이걸 String으로 바꿔서 우리의 프로그램에 사용하게 될 것이다.


KeyboardTest

package io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class KeyboardTest {
	public static void main(String[] args) {
		BufferedReader br = null;

		try {
			// 1. 기본 스트림(표준 입력, stdin, System.in)

			// 2. 보조 스트림 1 ( byte | byte | byte -> char )
			InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");

			// 3. 보조스트림 2 ( char1 | char2 | char3 | \n -> "char1char2char3" )
			br = new BufferedReader(isr);

			// 4. 처리
			String line = null;
			while ((line = br.readLine()) != null) {
				if ("quit".equals(line)) {
					break;
				}

				System.out.println(line);
			}

		} catch (UnsupportedEncodingException e) { // UTF-8이 오타가 날 수 있으니까
			System.out.println("Error: " + e);

		} catch (IOException e) {
			System.out.println("Error: " + e);
		} finally {
			try {
				if(br!=null) {
					br.close();
				}
			} catch ( IOException e ) {
				e.printStackTrace();
			}
		}
	}
}

PhoneList

image

  • StringTokenizer
package io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.StringTokenizer;

public class PhoneList01 {
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			File file = new File("phone.txt");

			// 파일 존재 유무에 대해서 Exception을 쓰지 말것. exists()로 확인할 것.
			if (!file.exists()) {
				System.out.println("File Not Found");
			}
			System.out.println("==== 파일정보 ====");
			System.out.println(file.getAbsolutePath());
			System.out.println(file.length() + "bytes");

			// 날짜 처리
//		Long timestamp = file.lastModified();
//		Date d = new Date(timestamp);
//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//		String date = sdf.format(d);
			String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss\"").format(new Date(file.lastModified()));
			System.out.println(date);

			System.out.println("==== 전화번호 ====");

			// 1. 기본 스트림(FileInputStream)
			FileInputStream fis = new FileInputStream(file);

			// 2. 보조 스트림 1 ( byte | byte | byte -> char )
			InputStreamReader isr = new InputStreamReader(fis, "UTF-8");

			// 3. 보조스트림 2 ( char1 | char2 | char3 | \n -> "char1char2char3" )
			br = new BufferedReader(isr);

			// 4. 처리
			String line = null;
			while ((line = br.readLine()) != null) {
				StringTokenizer st = new StringTokenizer(line, "\t ");

				int index = 0;
				while (st.hasMoreElements()) {
					String token = st.nextToken();

					if (index == 0) { // 이름
						System.out.print(token + ":");
					} else if (index == 1) { // 전화번호1
						System.out.print(token + "-");
					} else if (index == 2) { // 전화번호3
						System.out.print(token + "-");
					}else { //전화번호 3
						System.out.print(token);
						
					}
					index++;
				}
				System.err.println();
			}

		} catch (UnsupportedEncodingException e) {
			System.out.println("Error: " + e);
		} catch (IOException e) { // FilenotFoundException의 부모가 IOException임.
			System.out.println("Error: " + e);
		} finally {
			try {
				if (br != null) {
					br.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}
}

  • scanner에소 tokenizer가 내장되어있다.
package io;

import java.io.File;
import java.io.FileNotFoundException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class PhoneList02 {
	public static void main(String[] args) throws FileNotFoundException {
		File file = new File("phone.txt");

		// 파일 존재 유무에 대해서 Exception을 쓰지 말것. exists()로 확인할 것.
		if (!file.exists()) {
			System.out.println("File Not Found");
		}
		System.out.println("==== 파일정보 ====");
		System.out.println(file.getAbsolutePath());
		System.out.println(file.length() + "bytes");

		// 날짜 처리
		String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss\"").format(new Date(file.lastModified()));
		System.out.println(date);

		System.out.println("==== 전화번호 ====");

		Scanner scanner = new Scanner(file);
		while(scanner.hasNextLine()) {
			String name = scanner.next();
			String phone1 = scanner.next();
			String phone2 = scanner.next();
			String phone3 = scanner.next();
			
			System.out.println(name + ":" + phone1 + "-" + phone2+ "-" + phone3);
		}
		scanner.close();
	}
}


네트워크를 위한 개념

네트워크란?

컴퓨터들이 유무선으로 연결된 것

프로토콜

  • 규약
  • 연결이 되었다는 걸 확인시켜주는 신호를 주고 신호에 따라 응답하는 것이 약속이 되어있어야함.

네트워킹

네트워크에 연결된 장치 간에 미리 약속된 프로토콜을 사용해서 데이터를 교환하는 것

= 유무선으로 연결된 컴퓨터 간에 미리 약속된 신호들을 사용해서 데이터를 교환하는 것

Packet

  • Header : 프로토콜(ex. TCP/IP) 정의한 대로…
  • body : 데이터

  • image

Internet

TCP/IP기반 네트워크가 하나로 연결된 네트워크들의 모임

  • OSI 7 계층 : 하드웨어, 운영체계, 접속 매체와 관계없이 동작하는 개방형 구조 (지 할 일만 잘하고 서로를 간섭하지 않음 ) -> TCP/IP 4계층으로 단순화함.

WWWW

수많은 hyper text (문서)가 거미줄처럼 연결되어있다.

TCP/IP 4계층

  • Link 계층 : Lan -> 우린 관심없음
  • Internet 계충 : 여긴 관심 좀 있어야함.

HW상단에 OS = kernel 이 있다.

Kernel에는 메모리 관리, 드라이버, 시스템콜 명령어들, TCP/IP 를 쉽게 다루게 하기 위한 함수들이 있는 socket 라이브러리(내부에 C로 작성돼 있음)가 있다.


======Kernel=======
System call,
Socket,
TCP/IP
,
,
,
===================

        H W
     
===================

IP주소는 IPv4, IPv6이 있다.

image

  • 응용계층 : 우리가 앞으로 개발해나가는 것.

IP주소 Port번호는 소켓 라이브러리가 알고있고, TCP에 꼭 필요한 정보이다.

  • Ip주소 : 604동
  • port번호(=소켓 어드레스(주소)) : 504호

nslookup 사용해보기

  • DNS 도메인 네임

image

도메인 구매 사이트

  • 자바의 InetAddress가 IPAddress이다. => localhost 주소 알 수 있음.