IP Datagram

 

[ IP Datagram ]

 

<왼쪽 위부터 오른쪽 방향으로 차례대로 보시면 됩니다.>

- TCP 헤더 + IP 헤더 = 20 bytes + 20 bytes = 최소 40 bytes의 헤더크기를 가진다

(세그먼트 헤더와 데이터그램 헤더를 합친 값)

 

- Version : IP 프로토콜 버전 번호 ex) IPv4, IPv6

 

- HLEN : Header Length, 세그먼트의 헤더는 제외한 IP데이터그램의 헤더 길이(크기)

 

- Type of Service : 제공하는 서비스의 코드값으로 라우터로부터 받아야할 서비스를 기재하는데 실제로는 거의 사용하지 않는다.

 

- Total Length : 데이터그램의 전체 바이트 길이로, MTU에 제한을 받으며 최대 216제곱 바이트까지 가질 수 있다.

 

- Identification : 패킷들로 분할하는 단편화와 재조합을 위한 16비트의 식별자

 

- Flags : 6종류의 플래그 비트(URG, PSH, RST, SYN, FIN)가 있으며, 각 플래그 비트는 1비트를 가진다. 대표적으로 연결 설정할 때 필요한 SYN, 연결 끊기에 필요한 RST, 연결 해제에 필요한 FIN이 있다.

 

- Fragment Offset : 단편화와 재조합에 필요한 필드이다.

 

- TTL : Time-To-Live의 약자로, 최대 초기화값은 255이다. TTL은 데이터 전달을 확인하고자 최종 목적지에 도착할 때는 TTL=0의 값을 가져야한다. 하나의 지점을 지나갈 때마다 TTL1씩 감소하며, 최종 목적지가 아닌데 0이 되면 오류발생지로부터 출발지에 오류를 보낸다.

 

- Protocol : (UDP인지 TCP인지) 어느 프로토콜인지 알려주는 코드값이다.

 

- Header Checksum : 헤더에 대한 오류검사를 위한 필드로, 검사합(Checksum)은 전체 데이터그램을 합한 값의 1의 보수값이 저장된다. 수신측에서는 검사합과 실제 데이터그램의 합한 값을 더해보고 숫자 0이 들어갔을 경우 오류로 간주한다.

 

- Source IP Address : 출발지 IP 주소(32비트)가 저장된다.

 

- Destination IP Address : 목적지 IP 주소(32비트)가 저장된다.

 

- IP Options (if any) : 옵션이 없으면 헤더값 20바이트로 고정되지만 있으면 헤더값이 가변적일 수 있으므로 헤더 길이를 기재한다. 방문한 라우터들의 리스트를 명시하거나 타임스탬프를 기록한다. 선택적 필드이므로, 옵션을 제외한 나머지 필드는 무조건 있어야 한다.

 

- Padding : 글자 그대로 여백

 

- Data : TCPUDP 세그먼트가 저장되어 있다.

 

 


 

IP 단편화 (Fragmentation), 재조합 (Reassembly)

 

- 네트워크 링크들은 최대 전송 단위(MTU)를 가지는데, MTUFrame(2계층 데이터 단위)의 최대 크기이다.

 

- 단편화(Fragmentation) : 크기가 큰 IP 데이터그램은 망 내부에서 다수의 작은 데이터그램들로 분할된다. 하나의 데이터그램에 딱 한 번만 가능하다.

 

- 분할된 데이터그램들은 각각 독립된 객체로 취급받으며 개별적으로 캡슐화된다. , 분할된 데이터그램들은 각각 별도의 오버헤드가 생긴다.

 

- 재조합(Reassembly) : 최종 목적지에서 분할된 데이터그램들이 재조합되어 하나의 데이터그램이 된다. 따라서 하나라도 순서가 어긋날 경우 나머지 분할된 데이터그램들은 대기해야 한다.

 

- IP 헤더 필드값(Identification)을 보고 분할된 데이터그램들을 식별하여 재조합한다. , 같은 IP 헤더값을 가진 데이터그램들만 재조합한다.

 

- 목적지에서 재조합을 위한 버퍼가 있는데, 분할된 데이터그램들을 저장해놨다가 하나가 손실될 경우 재조합 타이머(Reassembly timer)Time-Out 나면, 출발지에서 재전송한다.



 

 


IP 주소(Addressing)

 

- IP 주소는 32비트 크기로, 호스트와 라우터 인터페이스에 대한 식별자이다.

 

- 인터페이스(Interface) : 호스트 또는 라우터와 통신 링크 사이의 연결을 의미한다.

 

- 라우터는 일반적으로 다수의 인터페이스를 가진다. 여러 개의 서브넷(Subnet)을 연결하는 중심 매체 역할을 하기 때문이다.

 

- 호스트는 일반적으로 하나 또는 둘의 인터페이스를 가진다.

 

- IP 주소는 각 인터페이스와 연관된다.

 

- 인터넷 네트워킹은 많은 서브넷(부분적인 네트워크)이 모인 전체 네트워킹이다. 같은 서브넷에 속한 인터페이스의 IP 주소는 앞부분이 똑같다. 이 앞부분을 Subnet Prefix라고 한다.

 

- 같은 서브넷끼리는 라우터를 거치지 않는다. 라우터는 서로 다른 서브넷들을 연결하기 때문이다.

 


 

 

사이더(CIDR)

 

- Classless Inter Domain Routing의 약자로, 클래스 없는 도메인 간의 라우팅 기법이다.

 

- 기존의 도메인은 Class A, Class B, Class C, Class D, Class E 로 나누어져 각기 다른 형식을 가진 주소로 이루어져있는데, 클래스 A, B, C까지는 유니캐스트(unicast) 주소이고, 클래스 DE는 멀티캐스트(multicast) 주소이다. IP주소 중 n 비트까지는 network 주소가 들어가고 나머지는 다른 주소가 들어가는 등의 방식으로 주소가 다양하다.

 

- 사이더는 최신의 IP 주소 할당 방법으로 기존의 IP 주소 할당 방식인 네트워크 클래스를 대체한다.

 

- IP 주소의 영역을 여러 네트워크 영역으로 나눌 때 기존방식에 비해 유연성을 더한다. 특히 IPv4 주소가 급격히 부족해지고 있으므로 해당 버전보다 효율적으로 사용하게 해준다.

 

- 접두어(Subnet Prefix)를 이용한 주소 지정 방식을 가지는 계층적 구조(Host IP < Subnet < Internet)를 활용하여 인터넷 광역 라우팅의 부담을 줄여준다. 여기서 사용하는 접두어는 Subnet에 포함되는 호스트 IP들을 대표하는 역할을 한다. 개개의 IP주소들을 포워딩 테이블에 저장하게 되면 탐색시간이 너무 길어진다는 문제점(광역 라우팅)을 해결한다.

 

- CIDR은 IP 주소를 Subnet portion(네트워크 주소) 부분과 Host portion(특정 호스트 주소) 부분으로 나눈다

 

- 표기 방식은 a.b.c.d/x (실제로는 문자가 아닌 숫자) 인데, 여기서 x는 Subnet portion의 비트 수이다.






IP 주소 할당(DHCP)

 

- IP 주소를 할당하는 방식에는 WindowsUNIX에서 두 가지가 있다.

  • 직접 설정하여 고정된 IP 주소를 가지는 방법

  • DHCP를 통해 동적으로 할당받는 방법

- 직접 고정된 IP 주소를 설정할 경우 주소의 비효율적인 사용이 되기 때문에 대부분 동적할당방법을 선택한다.

 

- DHCP : Dynamic Host Configuration Protocol의 약자로, 동적 호스트 구성 프로토콜을 의미한다. 클라이언트가 네트워크 관리자(DHCP 서버)에게 주소가 필요하다는 요청을 보내면 DHCP 서버에서 중앙에 관리하던 IP 주소들 중 하나를 클라이언트에게 동적으로 할당해준다.

 

- DHCP는 사용자들이 자주 바뀌는 환경(학교나 기업 등)에서 유용하다.

 

- 동적으로 할당한다.”는 의미는 사용 가능한 IP주소보다 더 많은 호스트(클라이언트)가 있는 경우에 IP 주소의 할당시간을 짧게 하여 네트워크를 동적으로 재구성할 수 있음을 뜻한다.

 

- 웹서버와 같이 영구적인 IP주소를 필요로 할 경우 정적인 주소를 제공한다.

 

- DHCP를 사용하는 목적

  • 호스트가 네트워크에 접속할 때 서버로부터 IP 주소를 동적으로 획득한다.

  • 네트워크에 연결되었을 때만 주소를 가지므로 연결이 안되어있을 때, 다른 클라이언트가 주소를 재사용할 수 있다.

  • 짧은 시간 동안에 네트워크에 연결되는 모바일 사용자(스마트폰, 태블릿 등)를 지원한다.

- DHCP 동작

  • 호스트는 DHCP 서버 발견(DHCP discover) 메시지를 브로드캐스트(broadcast)방식으로 발송
  • DHCP 서버는 DHCP 제공(DHCP offer) 메시지로 호스트에게 응답
  • 호스트는 DHCP 요청(DHCP request) 메시지로 IP 주소를 서버에 요청
  • DHCP 서버는 DHCP ACK 메시지로 호스트가 사용할 IP 주소를 전송

 

- 브로드캐스트 방식으로 소통하는 이유 : 맨 처음에 서버가 하나 이상일 수 있어서 통신할 서버의 주소를 모르기 때문에 호스트는 목적지 IP주소란에 브로드캐스트 주소를 넣어 메시지(데이터)를 보낸다. 이후, 서버로부터 받은 메시지(데이터)에서 서버의 주소를 알게 된 후 그 주소로 메시지를 보내면 2계층에서 오버헤드(MAC주소추가) 되었을 때 ARP 프로토콜이 처음 소통했던 서버의 주소와 다른 것으로 인지하고 중간에 데이터를 버린다. 브로드캐스트가 아닌 다른 IP 주소의 MAC주소가 2계층에서 추가되므로 서버 발견 메시지를 보냈을 때와 DHCP 요청 메시지를 보낼 때의 목적지 IP주소가 달라지기 때문이다. , 브로드캐스트로 통신을 시작했기 때문에 시작할 때와 다른 주소를 사용하여 데이터를 보내면 데이터는 버려진다.





▶ 인터넷 서비스 제공자(ISP)


- 인터넷 서비스 제공자(Internet Service Provider, ISP)에 의해 계층적으로 IP주소가 관리되어 라우팅 정보를 효율적으로 알린다. 여기서 효율성이란 포워딩 테이블에서 주소를 검색하는 시간을 짧게 하는 것을 의미한다


- 서브넷(Subnet) : 어떤 기관에 소속되어 있지만 분리되어 하나로 인식될 수 있는 네트워크망을 의미한다. 범위는 근거리 통신망 내에 속하는 모든 호스트들이 될 수 있다.



- 포워딩 테이블에서 Entry 수는 서브넷(Subnet)을 대표하는 라우터의 개수인데개개의 호스트들의 IP주소를 엔트리로 하면, 포워딩 테이블에서 주소를 탐색하는 시간이 길어지기 때문에 대표 라우터의 IP주소로 테이블을 구성하여 테이블 크기를 줄여서 탐색시간을 짧게 한다.


- 즉ISP가 계층적으로 주소를 관리하므로, 해당 서브넷에 해당하는 IP주소를 알리면 인터넷(Internet)에 연결되어있을 때 해당 Subnet에 포함되는 IP주소의 호스트와 통신할 수 있게 된다.

 

- ISPSubnet을 알 수 있는 방법은 인터넷 관련 최상위 기관인 국제인터넷주소관리기구(Internet Corporation for Assigned Names and Numbers, ICANN)에 의해 정보를 제공받기 때문이다. ICANN은 인터넷 DNS의 기술적 관리, IP 주소공간 할당, 프로토콜 관리, 루트 서버 시스템 관리 등의 업무를 조정한다.

 

 


 

▶ 네트워크 주소 변환(NAT)

 

- 네트워크 주소 변환(Network Address Translation, NAT)은 수많은 Subnet으로 이루어진 광범위한 네트워크에서 통신하기 위해 사용된다.

 

- Subnet 내부 통신의 경우 : private 제한을 가지는 홈 네트워크 같은 로컬 네트워크에서 데이터를 주고받게 된다. 이 때 라우터를 거치지 않고 자신의 IP주소를 사용한다.

 

- Subnet 외부 통신의 경우 : 자신의 IP와 같은 IP주소가 다른 Subnet에 있을 수 있기 때문에 라우터를 거쳐 갈 때 단 하나의 NAT IP주소로 변환되어 통신을 하게 된다. 당연히 통신을 하는 상대의 IP주소도 NAT IP주소로 변환된 것이다.


[ 라우터를 기준으로 좌 외부 통신(Internet), 우 내부 통신 ]



[ 라우터(NAT)를 기준으로 좌 내부 통신, 우 외부 통신(Internet) ]


- NAT IP주소로 변환되는 과정에서 IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하게 되는데, 패킷에 변화가 생기는 것이므로 IPTCP/UDP의 체크섬도 다시 계산된다. 이는 호스트 간의 통신에 복잡성을 증가시키는 것으로 네트워크 성능에 영향을 준다.

 

- 그럼에도 NAT IP주소로 변환하는 이유는 위에서도 언급했듯이 광범위한 네트워크에서 쉽고 빠른 통신을 위해 여러 개의 호스트가 하나의 공인 IP주소를 사용하여 인터넷에 접속하기 위해서이다.

 

- 다시 말해, 복잡성이 증가함에도 공인 IP주소를 사용하는 것은 여러 호스트에서 하나의 IP 주소를 공유함으로서 라우터의 탐색 시간을 줄여 보다 빠르게 통신하기 위해서이다.


- NAT 전의 ISP는 Subnet에 포함되는 IP 주소들(사설 IP)의 시작주소(Subnet Prefix)를 알렸는데, 여기서는 NAT에 의해 변환된 단 하나의 공인 IP주소(NAT IP주소)를 사용함으로서 ISP로부터 호스트별 주소를 할당받지 않고 단 하나의 IP주소만을 할당받는다.

 

- 공인 IP주소는 Subnet 외부의 통신을 위해 할당받는 것이기 때문에 로컬 네트워크에서 호스트의 주소를 바꾸게 되어도 Subnet 외부에는 알려지지 않는다. 그 외 다른 정보도 외부로부터 숨겨질 수 있어서 보안성이 더해진다.

 

- 로컬 네트워크에서는 기기의 주소를 바꾸지 않고, ISP만 바꾸는 것도 가능하다.

 

- NAT은 변환 테이블(Translation Table)을 통해 기존의 IP주소 및 포트번호와 대응되는 NAT IP 주소 및 새로운 포트 번호를 기억한다.

 

- 끝으로, NAT 라우터는 무조건 들어오고, 나가는 데이터그램의 헤더에 저장된 IP 주소, 포트 번호와 대응되는 NAT IP 주소, 새로운 포트 번호로 변환해야한다.






 

 

JComponent 클래스

 

최상위 컨테이너를 제외하고는 거의 모든 컴포넌트가 JComponent를 상속받는다.

 

- JComponent 클래스에는 스윙 컴포넌트들이 공통적으로 가져야 하는 속성과 메소드가 포함되어 있다.

 

- JComponent 클래스는 ComponentContainer 클래스를 상속받는다.


- Component 클래스는 화면 그리기이벤트 처리 기능을 제공한다.


Container 클래스는 컴포넌트 추가 및 제거 기능레이아웃 기능을 제공한다


- 이 기능들은 스윙 컴포넌트들도 모두 사용할 수 있다.

 

 

 

컴포넌트의 외관 변경 메소드


메소드

설명

void setBorder(Border border)

Border getBorder()

컴포넌트의 경계를 설정하거나 반환한다.

void setForeground(Color color)

Color getForeground()

컴포넌트의 전경색을 설정하거나 반환한다.

void setBackground(Color color)

Color getBackground()

컴포넌트의 배경색을 설정하거나 반환한다.

void setFont(Font font)

Font getFont()

컴포넌트의 폰트를 설정하거나 반환한다.

void setCursor(Cursor cursor)

Cursor getCursor()

컴포넌트의 커서를 설정한다.

 

 

 

컴포넌트의 상태 변경 메소드


메소드

설명

void setToolTipText(String text)

툴팁에 표시되는 텍스트를 설정한다

툴팁 : 컴포넌트에 마우스를 두면 표시됨

void setName(String name)

String getName()

컴포넌트의 이름을 설정하거나 반환한다.

boolean isShowing()

컴포넌트가 화면에 표시되고 있으면 true, 표시되지 않으면 false를 반환한다.

void setEnabled(boolean enabled)

boolean isEnabled()

컴포넌트의 활성화 여부를 설정하고 반환한다.

void setVisible(boolean visible)

boolean isVisible()

컴포넌트를 화면에 표시할지를 설정하고 표시 여부를 반환한다.

 

 

 

공통 이벤트 처리 메소드


메소드

설명

void addMouseListener(MouseListener mouseListener)

마우스 리스너를 추가한다.

void removeMouseListener(MouseListener mouseListener)

마우스 리스너를 제거한다.

void addActionListener(ActionListener actionListener)

액션 리스너를 추가한다.

void removeActionListener(ActionListener actionListener)

액션 리스너를 제거한다.

...

각 리스너마다 메소드가 addXXXX(), removeXXXX() 형태로 존재한다.




▶ 컴포넌트 그리기 메소드


메소드

설명

void repaint()

void repaint(int x1, int y1, int x2, int y2)

컴포넌트의 일부나 전체를 다시 그리라고 요청한다.

void revalidate()

컨테이너 안의 컴포넌트를 다시 배치하라고 요청한다.

void paintComponent(Grpahics g)

컴포넌트를 그린다. 만약 사용자 맞춤형 컴포넌트에서는 이 메소드를 오버라이딩(재정의)하여서 그림을 그린다.



 

컨테이너에 컴포넌트 추가 및 제거 메소드


메소드

설명

Component add(Component component)

컴포넌트를 컨테이너에 추가한다.

void remove(Component component)

컨테이너에서 컴포넌트를 삭제한다.

 void removeAll()

컨테이너의 모든 컴포넌트를 삭제한다.

Container getParent()

컴포넌트가 추가된 컨테이너를 반환한다.




▶ 레이아웃 메소드

 

메소드

설명

int getWidth()

int getHeight()

해당 컴포넌트의 너비와 높이를 픽셀 단위로 반환한다.

Dimension getSize()

해당 컴포넌트의 크기를 픽셀 단위로 반환한다.

int getX()

int getY()

부모 컨테이너를 기준으로 컴포넌트의 상대적인 x좌표, y좌표를 반환한다.

Point getLocation()

부모 컨테이너 안에서의 상대적인 위치를 반환한다.

Point getLocationOnScreen()

모니터 화면에서의 절대 위치를 반환한다.

void setLocation(int x, int y)

void setLocation(Point point)

부모 컨테이너 안에서의 컴포넌트의 좌표를 지정하며, 배치 관리자가 없는 경우에만 유효하다.

void setBounds(int x, int y, int width, int height)

부모 컨테이너 안에서의 컴포넌트의 위치와 크기를 설정한다. 배치 관리자가 없는 경우에만 유효하다.



 

크기와 위치 정보 얻는 메소드


메소드

설명

void setPreferredSize(Dimension dimen)

void setMaximumSize(Dimension dimen)

void setMinimunSize(Dimension dimen)

컴포넌트의 크기, 최소 크기, 최대 크기를 설정한다.

void setAlignmentX(float x)

void setAlignmentY(float y)

컨테이너 안에서의 컴포넌트들의 정렬을 지정한다.

void setLayout(LayoutManager)

LayoutManager getLayout()

배치 관리자를 설정하거나 반환한다.






 

 

컴포넌트 이벤트

 

컴포넌트가 이동되거나 가려지거나 크기가 변경되었을 경우에 발생한다.


- ComponentEvent 처리를 위해 리스너 인터페이스를 구현해야 한다.

 

ComponentListener 인터페이스

메소드

설명

componentHidden(ComponentEvent e)

setVisible() 메소드가 호출되어 컴포넌트가 가려진 경우에 발생

componentMoved(ComponentEvent e)

컴포넌트가 이동된 경우에 발생

componentResized(ComponentEvent e)

컴포넌트의 크기가 변화한 경우에 발생

componentShown(ComponentEvent e)

컴포넌트가 화면에 나타났을 때에 발생


Component 클래스

 메소드

설명 

 Component getComponent()

 이벤트가 일어난 컴포넌트를 반환한다.




▶ 컨테이너 이벤트

 

-컨테이너에 컴포넌트가 추가되거나 제거될 때에 발생한다.

 

- ContainerEvent가 발생했다고 표현하며, 이벤트 처리를 위해 아래의 리스너를 구현하여야 한다.


ContainmentListener 인터페이스

메소드

설명

componentAdded(ContainerEvent e)

컴포넌트가 컨테이너에 추가되는 경우에 발생

componentRemoved(ContatinerEvent e)

컴포넌트가 컨테이너에서 제거되는 경우 발생

 

 

 

포커스 이벤트

 

일반적으로 윈도우 시스템에서는 화면 상에 동시에 여러 개의 컴포넌트가 존재하고 이중에서 오직 한 개의 컴포넌트만이 마우스나 키보드 입력을 받을 수 있다.

 

마우스나 키보드 입력을 받을 수 있는 컴포넌트는 포커스(focus)를 가진다고 표현한다.

 

컴포넌트가 포커스를 가지거나 잃게 되면 FocusEvent가 발생하고, 이를 처리하기 위해 리스너를 구현하여야 한다.


FocusListener 인터페이스

메소드

설명

focusGained(FocusEvent e)

컴포넌트가 포커스를 획득하는 경우에 발생

focusLost(FocusEvent e)

컴포넌트가 포커스를 상실하는 경우에 발생

 

 

 

윈도우 이벤트

 

사용자가 윈도우 조작을 하는 경우에 발생한다.

 

윈도우를 열거나 닫는 경우, 아이콘화하거나 원상복귀하는 경우, 활성화하거나 비활성화하는 경우에 발생하는데 이를 WindowEvent라고 표현한다.

 

윈도우 이벤트와 비슷한 종류로, 윈도우 포커스 이벤트(Window Focus Event)윈도우 상태 이벤트(Window State Event)가 있다.

 

윈도우 포커스 이벤트는 윈도우가 포커스를 얻거나 잃었을 때 발생하고, 윈도우 상태 이벤트는 윈도우의 상태가 변경되면 발생한다.

 

이 이벤트들을 처리하기 위해 아래의 리스너를 구현해야 한다.


WindowListener 인터페이스

메소드

설명

windowOpened(WindowEvent e)

윈도우를 여는 경우에 호출

windowClosing(WindowEvent e)

윈도우를 닫으라는 요청을 받는 경우 호출

windowClosed(WindowEvent e)

윈도우를 닫은 후에 호출

windowIconified(WindowEvent e)

윈도우가 아이콘화되는 경우 호출

windowDeiconified(WindowEvent e)

윈도우가 복귀되는 경우 호출

windowActivated(WindowEvent e)

윈도우가 활성화되는 경우 호출

windowDeactivated(WindowEvent e)

윈도우가 비활성화되는 경우 호출

 

WindowFocusListener 인터페이스

메소드

설명

windowGainedFocus(WindowEvent e)

윈도우가 포커스를 얻는 경우에 발생

windowLostFocus(WindowEvent e)

윈도우가 포커스를 잃는 경우에 발생

 

WindowStateListener 인터페이스

메소드

설명

windowStateChanged(WindowEvent e)

윈도우의 상태가 변경되는 경우에 호출







 

 

ActionEvent

 

컴포넌트에 구체적인 동작이 일어났을 때 발생하는 이벤트로 버튼을 클릭하는 동작이 있다.

 

- ActionEvent를 받기 위해서는 ActionListener 인터페이스를 구현하여야 한다.


ActionEvent 클래스

 생성자

 ActionEvent(Object source, int id, String command)

 매개변수로 컴포넌트의 이벤트 소스(source)와 이벤트 동작을 식별하는 id값, 이벤트 동작을 나타내는 command값을 받아 초기화한다.

 ActionEvent(Object source, int id, String command,                                                   int modifiers)

 ActionEvent의 구체적인 수정키를 추가로 초기화한다.

 ActionEvent(Object source, int id, String command,                                    long when, int modifiers)

 ActionEvent의 구체적인 수정키들과 시간을 추가로 초기화한다.

필드

(변화 키)

 public static final int SHIFT_MASK

 이벤트가 일어나는 동안 쉬프트 키(Shift)가 눌러짐을 나타냄

 public static final int CTRL_MASK

 컨트롤 키(Ctrl)가 눌러짐을 나타낸다.

 public static final int META_MASK

 메타 키(Meta)가 눌러짐을 나타낸다.

 public static final int ALT_MASK

 알트 키(Alt)가 눌러짐을 나타낸다.

 public static final int ACTION_FIRST

 이벤트 동안에 이용되는 id의 범위 중 첫번째 순서

 public static final int ACTION_LAST

 이벤트 동안에 이용되는 id의 범위 중 마지막 순서

 public static final int ACTION_PERFORMED 이벤트 동작이 발생했다는 것을 나타냄

 메소드

 String getActionCommand() 해당 동작과 관련있는 커맨드 문자열을 반환한다.
 int getModifiers()

 ActionEvent가 일어나는 동안 변화 키들을 리턴한다.

 long getWhen() ActionEvent가 일어났을 때의 시간을 반환한다.
 String paramString()

 ActionEvent를 식별하는 문자열을 반환한다.


ActionListener 인터페이스

 메소드

설명 

 void actionPerformed(ActionEvent e) { }

 ActionEvent의 동작들을 처리한다. 



 

KeyEvent

 

사용자가 키보드를 이용하여 입력을 하는 경우에 발생한다


- KeyEvent가 발생하려면 컴포넌트가 반드시 키보드 포커스를 가지고 있어야 한다. 키보드 포커스를 얻으려면 requestFocus() 라는 메소드를 사용한다. 또한 KeyEvent 클래스는 InputEvent 클래스를 상속받는다.

 

-KeyEvent를 받기 위해서는 KeyListener를 구현하여야 한다.


KeyListener 인터페이스

메소드

설명

void KeyTyped(KeyEvent e) { }

사용자가 글자를 입력했을 경우에 호출

void KeyPressed(KeyEvent e) { }

사용자가 키를 눌렀을 경우에 호출

void KeyReleased(KeyEvent e) { }

사용자가 키에서 손을 떼었을 경우에 호출


KeyEvent 클래스

메소드

설명

int getKeyChar() { }

KeyEvent에 들어있는 글자(유니코드)

반환한다.

int getKeyCode() { }

KeyEvent에 들어있는 키코드(keycode)를 반환한다. 키코드란 글자가 아니라 키보드 자판의 각각의 키를 가리키는 상수이다.

예를 들어, Escape 키의 키코드는 VK_ESCAPE로 정의되어 있다.

boolean isActionKey() { }

이벤트를 발생시킨 키가 액션 키이면 true를 반환한다. 액션 키란 Cut, Copy, Paste, Page Up, Caps Lock, 화살표와 function 키를 의미한다.

 

InputEvent 클래스

메소드

설명

int getID() { }

이벤트의 타입을 반환한다.

MouseEvent.MOUSE_PRESSED, MouseEvent.MOUSE_RELEASED

MouseEvent.MOUSE_CLICKED

Component getComponent { }

이벤트를 일으킨 컴포넌트를 반환한다. getSource()를 사용하여도 된다.

, getSource()로 얻은 것은 해당 컴포넌트로 강제 타입변환 해주어야 한다.

int getWhen() { }

이벤트가 발생한 시각을 반환한다.

boolean isAltDown() { }

boolean isControlDown() { }

boolean isMetaDown() { }

boolean isShiftDown() { }

이벤트가 발생한 시각에 키보드의 수식키들의 상태를 반환한다.




MouseEvent & MouseMotionEvent

 

- Mouse 이벤트는 사용자가 마우스를 조작하는 경우에 발생한다.


- MouseEvent는 많은 메소드를 InputEvent 클래스에서 상속받는다. InputEvent 클래스의 메소드도 사용할 수 있다.


- MouseEvent를 받기 위해서는 MouseListener를 구현하여야 한다.

 

MouseListener 인터페이스

메소드

설명

void mouseClicked(MouseEvent e)

사용자가 컴포넌트를 클릭한 경우에 호출된다.

void mouseEntered(MouseEvent e)

마우스 커서가 컴포넌트로 들어가면 호출된다.

void mouseExited(MouseEvent e)

마우스 커서가 컴포넌트에서 나가면 호출된다.

void mousePressed(MouseEvent e)

마우스가 컴포넌트 위에서 눌려지면 호출된다.

void mouseReleased(MouseEvent e)

마우스가 컴포넌트 위에서 떼어지면 호출된다.



MouseEvent 클래스

메소드

설명

int getClickCount()

빠른 연속적인 클릭의 횟수를 반환한다.

int getX()

int getY()

Point getPoint()

이벤트가 발생했을 당시의 (x, y)위치를 반환한다위치는 컴포넌트에 상대적이다.

int getXOnScreen()

int getYOnScreen()

int getLocationOnScreen()

절대 좌표값 (x, y)을 반환한다이들 좌표값은 가상 화면에 상대적이다.

int getButton()

어떤 마우스 버튼의 상태가 변경되었는지를 반환한다

NOBUTTON, BUTTON1, BUTTON2, BUTTON3 중의 하나이다.


- MouseEvent로 마우스의 움직임을 추적하는 것은 시스템적으로 영향을 끼치므로 마우스가 이동하는 경우에만 따로 이벤트를 받도록 한다.


MouseMotionListener 인터페이스

메소드

설명

void mouseDragged(MouseEvent e)

마우스로 드래그하면 호출된다.

void mouseMoved(MouseEvent e)

마우스가 클릭되지 않고 이동하는 경우에 호출.







+ Recent posts