dev-course day10

2rlokr·2025년 3월 17일

dev-course

목록 보기
10/43
post-thumbnail

오늘 배운 것

실습

반복자(Iterator)

Collections Framework의 요소들을 순차적으로 탐색하고, 접근할 수 있게 해주는 인터페이스

반복자의 인터페이스에는 다음과 같은 메서드들이 정의되어있다.

public interface Iterator<E> {

  boolean hasNext(); // 다음 요소의 존재 여부를 반환합니다.
  //현재 가리키고 있는 index가 범위 내의 index냐를 보는 것
  
  E next(); // 컬렉션의 다음 요소를 반환합니다.
  // 현재 가리키고 있는 index의 요소를 반환하고, index를 +1 해준다.
  
  default void remove(); // 가장 최근에 반환한 요소를 제거합니다. 해당 메서드는 next()가 선행적으로 호출되어야 합니다.
  
}

반복자는 컬렉션의 내부 구현에 의존하지 않고, 컬렉션의 요소를 순회할 수 있다.
반복자는 표준화된 인터페이스를 통해 다양한 유형의 컬렉션(List, Set, Map 등)을 동일한 방식으로 순회할 수 있다.

public static void main(String[] args) throws InterruptedException {

	List<String> aryList = Arrays.asList("Apple", "Mango", "Banana");
	Iterator<String> aryListIterator = aryList.iterator();

	while (aryListIterator.hasNext()) {
		String element = aryListIterator.next();
		System.out.println(element);
    }
}

반복자는 컬렉션 요소를 순차적으로 접근하는 데는 매우 유용하지만, 단방향 순회만을 지원하며, 뒤로 이동할 수 없다. 또한, 반복자만을 사용하고자 하는 상황에서는 언어차원에서 제공되고 있는 for-each 반복문을 사용하는 것이 대안이 될 수 있다.

Stream API

Java 8에서 도입된 기능으로, 대량의 데이터를 간결하고 선언적인 방식으로 처리할 수 있게 도와준다.

Stream 생성

Stream은 요소들의 연속된 흐름을 나타내며, 스트림 파이프라인을 통해 다양한 연산을 수행할 수 있다.

public static void main(String[] args) throws InterruptedException {
        
    // 컬렉션
    List<String> collectionsList = Arrays.asList("Apple", "Mango", "Banana");
    Stream<String> fromCollectionStream = collectionsList.stream();

    // 배열
    String[] strArray = { "Apple", "Mango", "Banana" };
    Stream<String> fromArrayStream = Arrays.stream(strArray);
    
    // 값으로 직접 생성
    Stream<String> fromValueStream = Stream.of("Apple", "Mango", "Banana");


}

Stream 연산

내부 요소들에 대하여 순회를 하며 연산을 수행할 수 있다. 이 때 연산을 수행하고 나서 Stream을 반환하는 연산인 중간연산(Intermediate Operation)과 Stream을 종료하고 결과를 반환하는 연산인 최종연산(Terminate Operation)이 존재한다.

중간연산

Stream에서 수행되는 연산들로, 다른 Stream을 반환한다. 중간 연산은 연쇄적으로 적용될 수 있다.

filter()

조건에 맞는 요소만을 포함하는 Stream을 반환한다.

List<Integer> numList = Arrays.asList(1,2,3,4,5,6,7);
Stream<Integer> stream = numList.stream();

// 짝수 찾기
stream.filter(num -> num % 2 == 0);

map()

각 요소를 주어진 함수에 따라 변환하여 새로운 Stream을 반환한다.

List<Integer> numList = Arrays.asList(1,2,3,4,5,6);
Stream<Integer> stream = numList.stream();

stream.map(num -> num + 10);

sorted()

Stream의 값들을 오름차순으로 정렬하며, 인자로 Comperator를 제공하면 해당 객체의 정의된 규칙에 따라 요소들을 정렬하여 새로운 Stream을 반환한다.

List<Integer> numList = Arrays.asList(1,2,3,4,5,6);
Stream<Integer> stream = numList.stream();

stream.sorted();

distinct()

중복된 요소를 제거한 후 새로운 Stream을 반환한다.

List<Integer> numList = Arrays.asList(1,2,3,4,5,6);
Stream<Integer> stream = numList.stream();

stream.distinct();

최종연산

최종연산(Terminate Operation)은 Stream의 요소를 처리하여 결과를 반환하거나, 특정 작업을 수행한다. 최종 연산이 호출되면 Stream은 종료되어 더이상 사용할 수 없게 된다.

forEach()

각 요소에 대해 주어진 동작을 수행하며, 값을 반환하지 않는다.

List<Integer> numList = Arrays.asList(1,2,3,4,5,6);
Stream<Integer> stream = numList.stream();

stream.forEach( num -> System.out.println(num));

collect()

Stream의 요소를 Collection 타입 혹은 다른 형식으로 반환한다. 대개 중간 연산의 결과물을 Collection (하위)타입으로 반환하는데 사용한다.

List<Integer> numList = Arrays.asList(1,2,3,4,5,6);
Stream<Integer> stream = numList.stream();

stream.collect(Collectors.toList());

// 중간 연산 후 반환된 Stream을 Collections로 반환
stream.map(num -> num + 10).collect(Collectors.toList());

reduce()

Stream의 요소들을 누적하여 단일 결과를 생성한다.

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> stream = numList.stream();

stream.reduce((x,y) -> x+y);

다음과 같은 계산이 수행된다.

==
x = 1
y = 2
x + y = 3
==
x = 3
y = 3
x + y = 6
==
x = 6
y = 4
x + y = 10
==
x = 10
y = 5
x + y = 15
===
result = 15

count()

Stream의 요소 개수를 반환한다.

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> stream = numList.stream();

stream.count();

네트워크

  • 컴퓨터와 컴퓨터를 연결하여 데이터를 주고받거나 함께 협력할 수 있게 하는 것
  • 각종 통신 장비들이 서로 그물망처럼 연결돼서 데이터를 주고받을 수 있게 하는 통신망

네트워크 형식

LAN (Local Area Network)

근거리 영역 네트워크
건물이나 방, 특정 지역을 범위로하는 컴퓨터나 주변장치를 연결하는 네트워크

  • 연결하는 방식에 따라 STAR,,, 등의 방식으로 나눌 수 있다.

WAN (Wide Area Network)

광대역 네트워크
서로 다른 지역의 LAN을 연결한 네트워크
넓은 지역에서 여러 개의 LAN을 연결해서 통신하는 네트워크 구성방식

  • 이미 LAN방식에서 구성 방식이 정해졌기에 WAN은 구성방식이 따로 존재하진 않는다.

규약 (Protocol)

서로 지키도록 협의하여 정하여놓은 규칙이다. 컴퓨터 네트워크에서의 프로토콜은 서로 다른 기종의 컴퓨터끼리 통신하기 위해서 미리 정해놓은 통신 규약 및 통신 약속이다.

OSI Model (Open Systems Interconnections)

OSI 7계층

네트워크 통신을 위해 프로토콜을 설계 및 구현할 때 효율성과 상호 운용성을 높이기 위해 기능별로 각 계층을 나누어 구현하기 위해 사용하는 방식이다.

  • 7계층 -> 1계층 : 캡슐화
  • 1계층 -> 7계층 : 역캡슐화

1. 물리 계층
전기 신호를 이용해서 케이블에 전기 신호를 주면서 데이터를 전달하는 역할

2. 데이터링크 계층
물리계층을 통해 송수신되는 정보의 오류와 흐름을 관리하여 안전한 정보의 전달을 수행할 수 있도록 도와주는 역할

3. 네트워크 계층
네트워크 장치 간에 경로를 선택하고 데이터 전송을 수행해주는 역할

4. 전송 계층
양 끝단의 사용자들 간의 신뢰성있는 데이터를 주고 받게 해주는 역할

5. 세션 계층
통신할 때 통신 설정, 관리 및 종료를 해준다.

6. 표현 계층
전송하는 데이터의 표현방식을 결정한다.

7. 애플리케이션 계층
사용자와 가장 가까운 계층

데이터를 송신하는 송신자 : 7계층 -> 1계층 (캡슐화)
데이터를 수신하는 수신자 : 1계층 -> 7계층 (역캡슐화)

왜 계층을 나누는 거지?

  1. 통신이 일어나는 과정 중 이상이 생기면, 원인 파악이 쉬워지고, 해결하기 쉬워진다.
  2. 각 계층이 독립적으로 존재하기 때문에 특정 계층의 기술을 개선하거나 변경해도 다른 계층에 영향을 주지 않는다.

TCP/IP

OSI 7계층을 좀 더 효율적으로 이용하기 위해 간략화해서 사용하는 것

1. 네트워크 접근 계층 (Network Access Layer)
데이터를 전기신호로 변환한 후, 선로를 통하여 그 데이터를 전송하는 역할

2. 인터넷 계층(Internet Layer)
물리적인 데이터가 어떻게(어떤 경로로) 전송되어야 하는지 결정하는 역할

3. 전송 계층 (Transport Layer)
데이터가 전송될 때 신뢰성이 보장되어야 한다. 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다.

4. 응용 계층(Application Layer)
사용자와 어플리케이션 간의 소통을 담당할 수 있도록 하는 역할

OSI 7계층 데이터 형식

OSI 7계층

물리 계층 (Physical Layer)

전기 신호가 나가는 물리적인 장비로서 이 계층에서는 단지 데이터를 전달한다. 단지 데이터를 전기적인 신호로 변환해서 주고받는 기능만 있을 뿐이다.

LAN Card

컴퓨터가 네트워크 연결과 데이터 전송을 할 수 있게 하는 컴퓨터의 통신장치

  • 컴퓨터나 네트워크 장치가 데이터를 송수신할 때, 컴퓨터가 처리할 수 있는 형태로 데이터를 변환하는 역할
  • 즉, 한 컴퓨터에서 처리된 데이터를 전기 신호로 변환해 네트워크 내 다른 컴퓨터로 전송하고, 이 전기 신호를 수신해 다시 컴퓨터가 처리할 수 있는 데이터로 변환하는 역할이다.

UTP Cable (Unschielded Twisted Pair)

네트워크 장치들 간에 데이터를 전송하는 물리적인 매체이다. (물리적인 경로를 제공) 예를 들어, 컴퓨터, 스위치, 라우터 등의 네트워크 장치 간에 데이터를 전달하는 역할을 수행한다. 일반적으로 구리로 되어있고, 광섬유로 구성되어있다. 랜 포트에 장착하고, 전기신호를 주고받는다.

HUB

네트워크 장치들 간에 데이터를 전달하는 장치로, 입력된 신호를 모든 포트로 동일하게 전송한다. 전송되는 데이터 신호를 정형하여 증폭해서 왜곡된 데이터들을 보정한다. 그러나 허브는 데이터를 전송할 때 '브로드캐스트' 방식으로 전송하여 네트워크 상의 모든 장치에게 데이터를 보내므로, 다른 장치들이 그 데이터를 받게 된다.

물리계층을 통해 송수신되는 정보의 오류와 흐름을 관리하여 안전한 정보의 전달을 수행할 수 있도록 도와준다. 따라서 통신에서의 오류도 찾아주고 재전송하는 기능을 가지고 있다.

  • 네트워크에서 데이터를 전달하는 역할을 수행한다.
  • 데이터의 신뢰성, 효율성과 관련된 것도 수행한다.
  • 이 계층에서는 맥 주소를 가지고 통신하게 된다.

이더넷 (Ethernet)

원칙적으로 하나의 인터넷 회선에 유/무선 통신장비 공유기, 허브 등을 통해 다수의 시스템이 랜선 및 통신포트에 연결되어 통신이 가능한 네트워크 구조 (네트워크를 구성하는 방식 중 한 방법)

CSMA/CD (Carrier Sense Multiple Access / Collision Detection

두 대 이상의 컴퓨터가 데이터를 보내는 상황을 충돌이라고 하는데, 이런 충돌 현상을 방지하기 위해 이더넷에서는 전류 강도를 확인하고 사용가능하면 데이터를 보낸다. 이더넷에서 충돌을 감지하기 위한 프로토콜이다

맥 주소 (Media Access Control Address)

컴퓨터 안의 LAN 카드 안에 할당된 고유한 값으로, 48비트로 표현할 수 있다. 랜카드를 만드는 회사에서 부여된다. MAC 주소 덕분에 네트워크를 통해 데이터가 출발지에서 목적지까지 정확하게 도착할 수 있다.

네트워크 통신 방식

유니 캐스트

네트워크에 다수의 대상이 있을 때 그 중 특정 대상이랑만 1:1통신하는 방법

멀티 캐스트

네트워크에 다수의 대상이 있을 때, 그중 특정 대상들이랑만 1:N 통신하는 방법

브로드캐스트

네트워크에 다수의 대상이 있을 때, 그 모든 대상과 통신하는 방법 (전부 다에게 물어보는 것)

SWITCH

근거리 통신망(LAN)내의 장치를 연결하고 장치 간에 데이터 패킷을 전달하는 네트워킹 장치이다. 스위치는 MAC 주소를 사용하여 데이터 패킷을 식별하고 적절한 대상 장치로 전달하여 네트워크의 통신의 효율성을 향상시킨다.

  • 데이터를 보내면 스위치에 연결된 컴퓨터에 데이터를 보내는 역할.
  • 허브와의 차이점 : 입력된 데이터를 목적지에만 전송한다. (일괄 전송하지 않는다.)
  • 맥 주소 필터링 : 스위치에는 맥 테이블이라는 게 존재한다. 연결된 장비들의 맥 주소를 기억하고, 비교 대조 후 목적지를 판단할 수 있다.

네트워크 계층 (Network Layer)

경로(Route)와 주소(IP)를 정하고 패킷을 전달해주는 역할
즉, 목적지까지 가장 안전하고 빠르게 데이터를 보내는 기능을 말한다. 따라서 최적의 경로를 설정해야 한다.

라우팅 (Routing)

출발점 라우터부터 끝점 라우터까지 최적의 경로를 찾는 것을 라우팅이라고 부른다.
라우터는 다른 라우터를 식별할 때 IP 주소를 사용한다. WAN의 상황에서 필요하다.

IP (Internet Protocol)

네트워크에 연결된 각 장치 식별을 위해 할당된 숫자 식별자. 사용 목적에 따라 공인(Public IP)과 사설 IP(Private IP)로 구분된다. IP 주소는 네트워크에서 장치를 식별하고 찾는 데에 사용되어 데이터 패킷을 보내고 받을 수 있다.

공인 IP (Public IP)
전 세계적으로 유일하게 식별될 수 있는 IP 주소이다. ISP로부터 할당받는다. 외부 네트워크와의 직접적인 연결을 제공한다. 영원히 고정적이지 않고, 바뀐다. (유동 IP)

사설 IP (Private IP)
내부 네트워크망에서만 사용하는 IP. 이 IP로는 외부 인터넷을 사용할 수 없다. 인터넷과의 연결은 라우터나 게이트웨이를 통해 이루어진다.

ISP (Internet Service Provider)

KT, SKT, LG U+와 같은 인터넷 제공하는 회사. ISP에 연결되면, 연결과 동시에 공인 IP를 준다. 주기적으로 IP주소도 바꿔준다.

오늘 어려웠던 것

난 Stream을 잘 모르는데... 알고리즘 문제에서도 써본 적이 없음ㅎ.. 근데 강사님이 알고 있다.. 쉽다고 말한 분이 95%라고 말했다 하하... 다들 대단하시군요. 아무튼, Stream 내부 구현을 하는 것이 처음에는 어려웠다. 그리고 Iterator를 활용하는 것도 처음엔 이해가 잘 안됐다.

Stream은 강사님이 어떻게 이용하는지 예시를 보여주시니 좀 이해하기 쉬웠다. 그리고, Iterator도 강의자료보면서 복습을 하니 이해하기 쉬웠던 것 같다.

또, 네트워크 이론 수업에서.. 이게 역시 강의자료가 없다보니, 말만 듣고 기록을 해야 하는데 타이핑을 하면서 들으니까 놓치고,, 듣는 것도, 기록도 잘 해놔야 하다보니 조금 내용을 따라가기 어려웠다. 그리고, 생각보다 깊게(?) 들어가는 것 같아서, 이 내용을 교양처럼 들으라고 하셨는데 얼만큼 다 알아야 하는지, 외워야하는지(?) 감이 잘 안온다. 네트워크 부분은 반복해서 머리에 들어갈 수 있게 복습해야겠다.

느낀점

week3의 첫번째 날 ! 월요일이 밝았다. 오늘 수업을 듣다가 물을 쏟아서 난감했다. 그래도, 물이 많이 담겨있지는 않아서 심각하지는 않았지만, '쉬는 시간에 치워야지'하고 두는데 굉장히 신경쓰였다. ㅎㅎ.. 그리고.. 설마 데이터베이스까지 이렇게 강의자료가 없을지.. 없다면.. 수업 들을 때 어떻게 들어야 하지..? 하는 생각이 들었다. 그저 듣기만 하자니 내용을 나중에 복습할 때 다 떠올리지 못할 것 같고, 그렇다고 타이핑을 치자니 말을 따라가기 힘들어 놓치는 부분도 있을 것 같고.. 어떡해야 해!! 어렵군. 그래도 최대한 쳐놓고 이후 복습하면서 인터넷에 찾아보면서 보충해야 하나 .. 싶긴하다. 벌써 자바 다 나가고, 네트워크로 왔다. 굉장한 속도야! 이번주도 열심히 달려야지 :)

0개의 댓글