스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 다음과 같은 입출력 스트림이 있다.

어떠한 대상에 대해서 작업을 할 것인지 그리고 입력을 할 것인지 출력을 할 것인지에 따라서 해당 스트림을 선택해서 사용하면 된다.

이들은 모두 InputStream 또는 OutputStream의 자손들이며, 각각 읽고 쓰는데 필요한 추상메서드를 자신에 맞게 구현해 놓은 것들이다.

IO 기본적으로 버퍼를 지원하지 않기 때문에, 버퍼를 제공해주는 보조스트림을 이용합니다.

한 문자를 의미하는 char형이 2byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다.

이 점을 보완하기 위해서 문자기반의 스트림이 제공된다. 문자 데이터를 입출력할 때는 바이트 기반 스트림 대신 문자기반 스트림을 사용한다.

문자기반 스트림이라는 것이 단순히 2byte로 스트림을 처리하는 것만을 의미하지 않는다.

문자 데이터를 다루는데 필요한 또 하나의 정보는 인코딩으로 문자기반 스트림,Reader/Writer 그리고 그 자손들은 여러 종류의 인코딩과 자바에서 사용하는 유니코드간의 변환을 자동적으로 처리해준다. Reader틀정 인코딩을 읽어서 유니코드로 변환하고 Writer는 유니코드를 특정 인코딩으로 변환하여 저장한다.

객체를 저장한다는 것은 무엇을 의미하는가에 대해서 정리하고 넘아가자면 객체는 클래스에 정의된 인스턴스 변수의 집합입니다.

객체에는 클래스 변수나 메서드가 포함되지 않습니다. 객체는 오직 인스턴스 변수들로만 구성되어 있는데, 그 이유는 인스턴스 변수는 인스턴스마다 다른 값을 가질 수 있어야 하기 때문에 별도의 메모리 공간이 필요하지만 메서드는 변하는 것이 아니라서 메모리를 낭비해 가면서 인스턴스마다 같은 내용의 메서드를 포함시킬 이유가 없습니다,

따라서 객체를 저장한다는 것은 바로 객체의 모든 인스턴스변수의 값을 저장한다는 것이고, 저장한 객체를 다시 생성하려면 객체 생성한 후에 저장했던 값을 읽어서 생성한 객체의 인스턴스 변수에 저장하면 되는 것

여기서 비효율적인 부분이 보이는데 커널 영역의 데이터를 포르세스 안의 버퍼로 저장하는 일이다. 커널 영역의 버퍼를 직접 전근할 수 있다면 굳이 프로세스 안의 버퍼로 복사하면서 cpu 낭비하지 않아도 되고, GC 관리도 필요없어지게 된다. 또 하나의 문제는 위 프로세스를 거치는 동안 작업을 요청한 쓰레드가 블록킹 된다는 것이다.

1. 자바 프로그램은 JVM 위에서 동작하는데, 우리가 자바 클래스를 컴파일하면 바이트코드로 변환이 되고 .class 파일로 디스크에 저장합니다.

2. 그러고 난 다음 디스크에서 class 파일을 찾아서 클래스 로더는 그것들을 메모리에 적재합니다.

3. 그리고 자바는 static memver들 예를 들어 static method, static field, static block들을 찾습니다.

4. 스태틱 필드나 메소드에 접근할 때 클래스들을 초기화 하는데 예를 들어 클래스에서 메인 메서드를 실행하면 메인 메서드가 정적이기 때문에 클래스가 초기화됩니다. 클래스의 객체나 인스턴스들이 new keyword 통해 생성될 때도 클래스가 초기화됩니다.

5. 그런 다음 자바는 메모리를 할당하고 객체 참조 변수에 대해서는 스택에 메모리를 할당합니다.

6. 메모리를 할당한 후에 JVM은 클래스의 생성자를 호출합니다.

7. 필드 및 메소드 액세스가 완료되면 JVM에 의해 메모리에서 객체와 참조가 제거됩니다.

 

 

1. Created 단계로 객체 생성을 뜻합니다. 객체가 생성되면 사용할 준비가 되고 JVM의 메모리 힙에 저장됩니다.

2.두번째는 In Use 단계로 객체가 생성되어 다른 객체에 의해 참조되어 있는 상태입니다. 코드에서 Dog 객체는 사용 중에 있다고 볼 수 있습니다. 이렇게 사용중인 객체는 GC 대상에서 제외됩니다. Created 상태와 In Use 상태의 차이점은 객체가 생성 될 때 사용 중이거나 사용 중이 지 않을 수 있다는 것입니다. 객체를 생성하고 Reference가 없으면 In Use 상태로 볼 수 없습니다.이 경우에는 Unrechable 상태로 간주합니다. 

3. 세번째 단계는 Invisible 단계로 모든 객체가 이 상태를 거치는 것은 아닙니다. Invisible 상태는 Strongly referenced 는 되어 있지만 직접 접근할 수 없는 상태이며 바로 GC의 대상이 되지 않는다는 점입니다. foo의 역할이 이미 종료되었어도 run() 리턴될떄까지 strong reference 가집니다. 이 상태가 바로 invisible 상태인데, strong reference 가졌지만 foo 다시 접근할 수 없는 상태이며 while 문이 끝날 때까지 계속 메모리가 유지되는 것입니다. 그래서 memory leak 을 유발할 수 있기 때문에 명시적으로 null 을 만들어 주는 것이 좋습니다. null이 되면 strong reference해지되면서 Unreachable 상태가 되기 때문입니다.

4. 네번째 단계인 UnreachableStrong Reference가 해제되어 GC의 후보가 된 상태를 말합니다.  후보가 된다고 해서 바로 GC가 되는 것은 아니지만 GC 대상 <>에 들어갑니다.

5. 다섯번째 단계인 Collected 단계는 메모리 해제 단계의 도입 부분으로 Unreachable Object로 인식된 다음의 상태인데 할당된 메모리가 해제되기 직전의 상태로 보면 됩니다. 이 상태에서는 GC가 객체의 finlize() 가 정의되어 있는지 판단하게 되고 finlize 메소드가 있다면 finalizer 라는 queue 에 넣고, 없으면 바로 다음 단계인 finalized 상태로 전환 시킵니다.

6. 여섯번째 단계인 Finallized 단계는 finalizer 통해 finalize가 실행된 후의 상태입니다. finalizeCollected 상태라고 해서 바로 수행되는 것이 아니라 finalizerQueue에 들어가는 것이기 때문에 finalize가 호출되는 시간이 보장되지 않습니다. Finalizer는 데몬 스레드로써 객체가 메모리에서 제거하기 전에 사용하는 리소스를 해제하는 역할을 수행합니다.

7,. 마지막 단계인 Deallocated는 메모리 반환이 끝난 상태로 GC 동작이 마무리 된 상태라고 볼 수 있습니다.

 

 

1.Garbage collectorreference root set으로 부터 참조를 통해 도달 가능한 객체들을 제외하고는 모두 garbage로 간주한다. garbage collector의 관점에서는 참조할 수 있는 객체(reachable)와 참조할 수 없는 객체(not reachable)로 나뉘게 된다. Reference object들을 이용하면 reachable한 객체에 대해서 참조에 대한 강약을 조절할 수 있다.

2.Root set으로 부터 시작한 참조 사슬에 속한 객체들은 reachable객체이고 이 참조 사슬과 무관한 객체들이 unreachable GC 대상이 됨

3.참조가 계속 남아있는 경우가 있을 수 있고 이런 경우에 객체는 수거되지 않고 memory leak으로 이어질 수 있다. 이와 같이 참조를 부주의하게 사용하여 발생할 수 있는 memory leak현상을 막기 위해서는 객체에 대한 참조를 유연하게 다루어 필요하지 않은 객체들이 수거될 수 있도록 해야한다.

  • 네트워크 통신에서는 주로 IP주소를 통해 통신한다.
    • mac주소는 사람이 입력하기에 너무 복잡해서, 더 간단한 주소 체계인 IP주소를 통해 통신한다. 
  • IP주소는 3계층에서 사용하는 주소 체계이다. 
    • 2계층은 mac주소이다. 
    • IP주소는 정말 복잡하다...........
  • 3계층에서 하는 일 
    • 다른 네트워크 대역을 연결시켜 준다.
    • LAN과 LAN을 연결시켜 주는 것이 3계층의 역할
    • 3계층의 대표적인 장비 - 라우터
      • 서로 다른 LAN을 묶어주려면 이것이 필요하다. 
    • 멀리 있는 네트워크와 통신할 때는 MAC 주소 뿐만이 아니라 IP 주소가 필요하다. 
    • ipconfig
      • IPv4 주소 : 현재 PC에 할당된 IP주소
      • 서브넷마스크 : IP 주소에 대한 네트워크의 대역을 규정하는 것
      • 게이트웨이 주소 : 외부와 통신할 때 사용하는 네트워크의 출입구 
        • 위의 3가지는 멀리있는 것과 통신하기 위한 최소한의 설정
  • 3계층 프로토콜 
    • ARP 프로토콜
      • IP주소를 이용해 MAC 주소를 알아오는 프로토콜
    • IPv4 프로토콜
      • WAN에서 통신할 때 사용하는 프로토콜
    • ICMP 프로토콜
      • 서로가 통신되는지 확인할 때 사용하는 프로토콜
  • IP 주소 (통산 IPv4주소)
    • 클래스 별로 나눠서 사용 (old version) - 사용할 수 있는 범위가 딱 정해져 있음 
    • MAC 주소는 6 Byte이고, IP주소는 4Byte다. 
      • 여기서 잠깐, 
        • 1 Byte는 8Bit , 2진수로 2^8 
          • 00000000 (0) ~ 11111111 (255) 
          • 0.0.0.0 ~ 255.255.255.255
    • 네트워크를 구분하고 -> PC를 구분하는데 쓰인다.
    • 기존에는 classful하게 썼는데 아이피주소가 부족해서 서브넷마스크를 이용해 네트워크를 구분한다.
      • 서브넷 마스크
        • 네트워크 대역을 나눠주는 데 사용하는 값
        • 2진수로 표기했을 때 1로 시작, 1과 1사이에는 0이 올 수 없다는 규칙 
          • 255.255.255.192 -> 11111111.11111111.11111111.11000000
            • 1인 지점까지가 네트워크를 구분하는 곳이고, 0은 그 하나의 네트워크 대역에 속한 컴퓨터를 구분하는 데 쓰임
    • 현재 version IPv4
      •  사설 IP와 공인 IP 
        • 공인 IP 1개당 2^32개의 사설 IP
        • 공인 IP는 인터넷 네트워크 통신망에서 사용하는 IP 주소 
        • 사설 IP는 같은 네트워크 대역에서 사용하는 IP 주소
      • 아이피 주소 부족 현상으로 사설 IP와 공인 IP로 구분해서 사용하기로 했다. 
        • 사설 네트워크 대역에 있는 장비들은 네트워크 통신을 할 때 공인 IP로 바꿔서 인터넷과 통신한다. 
          • 우리 강의장에서는 사설 네이버 같은 다른 네트워크 대역으로 갈 때 공인 IP로 바뀌어서 간다.
          • 따라서 외부에서 볼 때는 같은 네트워크 대역에 있는 장비들이 구분이 되지 않는다.
          • 네이버가 우리한테 웹툰을 보내주면, 공인 IP로 들어오지만 공유기에서 누가 요청한건지 찾아서 전달해준다.
          • 인터넷 비용을 매월 3만원씩 낸다 -> 공인 IP 하나를 사는 것임
            • 집에 있을 때는 공유기를 통해 통신하는 것임 (컴퓨터, 핸드폰 이용)
        • NAT (Network address translator)
          • 사설 IP에서 공인 IP로 바꿔주는 것  - NAT는 기술임
            • NAT table에 요청이 나갈 때 기록함 
            • 나간적이 없어서 NAT table에 기록된 게 없는데 어디선가 공유기에 데이터를 전달하면 공유기가 받고 끝이 난다. 
            • 서버는 어떻게 되나?
              • 웹서버 (네이버)가 있다고 치자.
              • 우리가 네이버에 요청을 하고, 웹서버는 사설IP대역에 있다 치면..
              • 네이버는 나간적이 없으니까 NAT 테이블에 기록이 안되어 있을테니 요청을 받아도 기록된게 없어서 응답을 보내줄 수 없음
              • 서버는 따라서 공인 IP를 주로 씀 
                • 아니면 공유기에 뭔가 추가 설정을 함 (포트포워딩) 
          • 이 기술을 이용해서 IP부족 현상을 해결한 것 
        • 0.0.0.0 (wildcard)
          • 나머지 모든 IP주소를 말함 
          • 일반적이지 않음 
        • 127.0.0.1 
          • 자기 자신을 뜻하는 주소 
          • 통신이 안될 때 내 아이피 주소에 ping 때려봄 
        • 게이트웨이 주소 
          • 공유기의 IP 
          • 쓸 수 있는 IP에서 가장 적거나 가장 큰 IP 주소를 적음 
          • 설정 안되어 있으면 인터넷이 안됨 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 로컬에서 통신할 때는 OSI 7 Layer에서 2계층을 이용함
    • Ethernet만 알아볼 것임
  • 2계층에서 하는 일
    • 하나의 네트워크 대역, LAN 대역에서 존재하는 여러 노드들이 통신할 때 사용한다. 
    • 2계층은 하나의 네트워크 대역 즉, 같은 네트워크 상에 존재하는 여러 장비들 중에서 어떤 장비가 어떤 장비에게 보내는 데이터를 전달 
      • 다른 네트워크와 통실할 때는 항상 3계층이 도와주어야 한다.
      • IP주소를 사용한다던가 3계층 장비를 이용해 통신한다던가 해야함
    • 오류제어, 흐름제어도 함 
  • 2계층에서 사용하는 주소 
    • 물리적인 주소
    • LAN에서 통신할 때 사용하는 MAC주소 
      • OUI (IEEE에서 부여하는 일종의 제조회사 식별 ID) + 고유번호 (제조사에서 부여한 고유번호)
      • 6C-29-95-04-EB-A1
        • 16진수 1개가 4bit

  • 2계층의 프로토콜
    • LAN에서 통신할 때 사용하는 Ethernet 프로토콜
      • 구조
        • Destination Address(목적지 MAC주소 / 6byte) + Source Address(출발지 MAC주소 / 6byte) + Eternet Type (0800이면 IPv4 / 2byte) 
        • 총 14byte로 구성되어 있는 Ethernet 프로토콜
        • Eternet Type
          • 데이터가 IP인지 ARP인지 뭔지 미리 알 수 있도록 상위 프로토콜이 뭔지 알려주는 정보

앞에 6Byte는 보내는 사람 mac주소, 뒤의 6Byte는 받는 사람 mac주소, 0800은 이더넷 타입으로 IPv4임을 알려준다.

 

  • TCP/IP
    •  초기 네트워크 모델 방식 
    • 4개의 계층으로 이뤄짐 
    • 프로토콜로 구분되어 있어서 프로토콜로 구분해서 이해할 때는 TCP/IP로 이해하면 편함 
  • OSI 7계층
    • 네트워크 통신을 표준으로 지정한 모델
    • 데이터를 주고 받을 때 데이터 흐름을 각 구간별로 나눔 
    • 역할 기반
    • 7계층 HTTP, 4계층 TCP/UDP, 3계층 IP/ICMP/ARP, 2계층 이더넷 정도만 알아보면 됨
  • 네트워크를 통해 전달되는 데이터, 패킷
    • 패킷이란?
      • 데이터 자체를 통칭해서 씀
      • 하나의 블록 단위 
      • 제어정보 + 사용자 데이터 (누가 누구에게, 어떻게, 뭘 요청하는지, 뭘 보내주는지 등의 정보가 패킷안에 담겨있다) 
      • 여러가지 프로토콜의 조합!
        • 패킷 안에 있는 프로토콜도 순서가 있다!
        • 헤더 + 페이로드 + 풋터 
          • 예를 들어
            • HTTP 프로토콜을 페이로드로 해서 TCP라는 헤더를 붙였음 -> 1 패킷 완성
            • 근데 다시 이 패킷을 페이로드로 해서 IPv4 프로토콜을 헤더로 붙임 - >  2 패킷 완성
            • 다시 이 패킷을 페이로드로 해서 Ethernet 프로토콜을 헤더로 붙임  -> 3패킷 완성 
          • 이 과정을 캡슐화라고 한다 
            • 이건 보낼 때 사용
            • 패킷을 만드는 과정 
            • 예 
              • 마음의 소리 몇 화가 보고 싶다고 요청함 네이버에
                • '나 마음의 소리 몇 화가 보고 싶어' -> 데이터 
                • 네이버의 웹서버와 연결해야 하니까 TCP로 캡슐화 했음 (TCP(헤더) + 데이터)
                • 멀리 가야하니까 Ipv4 헤더를 또 붙임 
                • 이 패킷을 페이로드로 해서 가까운 곳이랑 일단 연결해야 하니까 Ethernet 헤더를 붙임
              • 상위 계층에서 하위 계층으로 내려가면서 패킷을 붙임
    • 계층별 패킷의 이름 
      • TCP + 데이터 -> 세그먼트  (4계층의 PDU)
      • IPv4 + TCP + 데이터 -> 패킷 (3계층의 PDU)
      • Ethernet + IPv4 + TCP + 데이터 -> 프레임 (2계층의 PDU)

+ Recent posts