Internet (인터넷) 


물리적 네트워크(network)들을 연결한(inter) 논리적인 네트워크 구조

 

- 통신 규약인 프로토콜이 데이터 메시지를 주고받는 것을 제어한다.

 

- Internet Service Providers(인터넷 서비스 제공자 - ISPs)에 의해 내부적으로 연결된다.

* ISP : 개인이나 기업체에게 인터넷 접속 서비스, 웹사이트 구축 및 웹호스팅 서비스 등을 제공하는 회사를 말한다. 또한 인터넷 접속에 필요한 장비와 통신회선을 갖추고 있다.


 

Protocol (프로토콜)


컴퓨터간에 정보를 주고받을 때의 통신방식에 대한 규칙과 약속

 

- 인터넷의 모든 통신 활동은 프로토콜(통신규약)에 의해 통치된다.

 

- 구성요소 : Syntax(메시지의 형식), Semantics(메시지의 의미), Timing(메시지의 순서)


- 예를 들어, 프랑스인과 한국인이 대화를 할 때 서로 언어가 다르기 때문에 통신을 할 수가 없다. 여기서 '어떤 언어를 사용할 것인가'와 같이 정해진 통신 규약을 '프로토콜'이라고 한다. 즉, 서로 다른 프로토콜을 사용하는 컴퓨터끼리는 통신할 수 없다. 대부분 인터넷에 접속하는 통신 방식은 TCP/IP 프로토콜이다.

 

인터넷 프로토콜 표준화 기구

  • RFC : Request For Comments
  • IETF : Internet Engineering Task Force

 

 

네트워크(Network)의 구조

 

- 인터넷(Internet) : 여러 개의 네트워크를 이루는 큰 네트워크

      1. 하나의 프로토콜만 사용한다.
      2. 웹 브라우저(크롬, 인터넷 익스플로러 등)를 이용해서 접속한다.

- 인트라넷(IntraNet) : 내부의 네트워크로, 사내 업무와 같이 특정 영역에서만 사용되는 네트워크

      1. 회사에서 쓰는 여러 프로그램들을 마치 인터넷을 사용하는 것처럼 쓰도록 만들어 놓은 것이다.
      2. 따라서 회사 직원 이외에는 사용할 수가 없다. 실제로 사내 사이트에 접속할 때도 외부로부터 접속은 차단된다.

- 엑스트라넷(ExtraNet) : 인트라넷처럼 특정 업무를 위해 특정 영역에서만 사용되나, 다른 외부인들도 접속가능한 네트워크


- 전체적으로, 여러 개의 클라이언트와 서버들로 이루어져 있지만 종종 데이터 센터에 서버가 있는 경우도 있다.

 * 이렇게 인터넷에 접속된(연결된) 컴퓨터를 호스트(Host)라고 부른다. 클라이언트와 서버 모두 호스트이다.


- 무선, 유선 통신 링크들과 같은 물리적 매체(UTP 케이블, 광 케이블 등)를 통해 네트워크에 접속한다.

 

- 네트워크의 중심은 상호 연관되는 라우터(Router)들과 수많은 네트워크들이 연결된 거대 네트워크, 인터넷이다. 라우터는 서로 다른 네트워크를 연결하는 물리적 장치이다.


- LAN : Local Area Network 의 약자로,  한정된 지역에서의 네트워크 구축을 의미한다.


- WAN : Wide Area Network 의 약자로, 멀리 떨어진 곳과 연결할 네트워크를 구축하는 것을 의미한다.


- 요즘의 '네트워킹'은 LAN과 WAN을 모두 아우르는 말이다.

 

 

네트워크 접속망

 

- 기관 접속망, 모바일 접속망, 거주지 접속망(ex : LAN), 기업 접속망 등 다양한 접속망(Access Network)이 있다.

 

- Digital Subscriber Line(이하 DSL) : 디지털 가입자 회선으로 중간 오피스 DSLAM에서 기존의 전화망을 이용한다. 데이터는 인터넷으로 이동하고, 음성은 전화망으로 이동한다. 대부분의 인터넷 사용자가 업로드하는 데이터보다 다운로드하는 데이터가 훨씬 크기 때문에 다운로드에 더욱 많은 대역폭과 연결 속도를 제공하겠다는 생각에서 나온 것이다. 업로드 속도보다 다운로드 속도가 월등하게 크다. 업로드 최대 속도 2.5Mbps, 다운로드 최대 속도 24Mbps로 대략 10배정도 차이가 난다.

장점 : 일반 전화선을 사용하면서도 메가(Mbps)급의 데이터 전송속도를 제공할 뿐 아니라 집집마다 광케이블을 설치하지 않고도 비동기전송방식(ATM)망과 맞먹는 네트워크를 구축할 수 있다는 것이다.

 

- Cable Network(케이블망) : 유선 텔레비전 방송망으로 주파수 분할 다중화 방식을 사용한다. 주파수 분할 다중화(FDM)란 통신 링크(전송 매체)를 서로 다른 주파수 대역으로 분할하여 각각의 채널을 할당하는데, 통신 링크로 오는 각각의 데이터들은 해당 주파수 대역의 전송파로 변환되어 전달되어지는 방식이다.

 

- Home Network(홈네트워크) : 유무선 인터넷을 통해 냉장고, 에어컨, 전자레인지, TV 등 주요 가전제품을 제어하고 기기 간 콘텐츠를 공유할 수 있는 기술이다. , 집 안의 가전제품과 정보통신기기간의 데이터를 주고받는 통로를 제공하며, 외부 인터넷 망과의 접속을 제공함으로써 지능적인 통신을 가능하게 하는 네트워킹이다.

 

- Enterprise Access Network (Ethernet) : 이더넷(Ethernet)이란 버스 구조의 근거리 통신망(LAN)에서 사용하는 네트워크 방식이다. 일반적으로 회사, 대학 등에서 사용되는 기업 접속망의 형태이다. 기업 내부의 여러 컴퓨터를 하나의 선으로 통신하고자 하였으나 충돌이 발생하는 문제점을 해결하기 위해 고안된 네트워크이다. 데이터를 보내려는 컴퓨터가 먼저 통신망이 사용 중인지 아닌지 검사한 후에 비어 있을 때 데이터를 보낸다. 통신망이 사용 중이면 일정 시간을 기다린 후 다시 검사한다. 통신망이 사용 중인지는 전기적인 신호로 확인할 수 있다. 쉽게 말해서 근처에 있는 컴퓨터끼리 통신할 때 충돌 없이 순조로운 통신을 하기 위해 만든 방법이다. 10Mbps, 100Mbps, 1Gbps, 10Gbps의 전송속도를 가진다. 이더넷 방식은 CSMA/CD 라는 프로토콜을 사용한다. 

* CSMA/CD : Carrier Sense Multiple Access/Collision Detection

 

- Wireless Access Network (무선 접속망) : 공유되는 무선 접속망이 Base Station을 중심으로 end system(송수신시스템)과 라우터를 연결한다. 근거리 통신망도 있고, 광역 통신망도 있다. 광역 통신망(WAN)은 전화망 사업자(telco)에 의해 제공되며 1~10Mbps의 전송속도를 가진다.

 

 

Host(호스트)에서의 패킷 전송

 

- 보내야할 메시지(정보)L bits의 길이에 해당하는 패킷으로서 더 작게 분할한 뒤, 접속망(통신 링크)으로 해당 패킷을 전송한다. 이 때 링크의 전송속도(Transmission rate)R bps이라고 둔다.

 

- 전송속도(Transmission Rate) : 전송속도는 링크의 수용력(Capacity) 또는 링크의 대역폭(Bandwidth)을 의미하기도 한다. (bits/sec)

 

- 전송 지연(Transmission Delay) : 어느 노드(host, end system..etc)에서 비트(데이터)를 신호로 바꾸어 특정 링크에 전달하는데 걸린 시간

  • L(bit) / R(bits/sec) -> 패킷의 길이 / 링크의 속도
  • , 데이터의 크기에 비례하고, 링크의 수용력 또는 대역폭에 반비례한다.
  • 링크의 속도가 크다는 것은 한 번에 더 많은 데이터를 링크에 담을 수 있으므로 링크로 데이터를 보내는 시간이 짧아진다. 흔히 파이프 용량이 증가했다고 표현한다.

 

- 전파 지연(Propagation Delay) : 송신측(Sender)에서 수신측(Receiver)으로 데이터(신호)가 전파될 때 통신 링크 상에서 걸리는 시간

  • D(km) / V(m/s) -> 노드간의 거리 / 전파속도
  • 이 때, 전파속도는 링크의 매체에 따라 다르다. -> optical fiber(광섬유), copper(구리) ..etc

 

- 처리 지연(Processing Delay) : 노드(host)에서 데이터의 처리(경로설정, 에러 검출 및 정정, 스위칭 등)를 위해 소비하는 시간

 

- 큐잉 지연(Queueing Delay) : 버퍼링 지연이라고도 하며, 패킷이 라우터에 도착하고 다음 목적지로 전송되기까지 큐에서 대기하는 시간.

  • 버퍼(큐 사이즈)의 크기가 클수록 큐잉 지연이 길어지고, 버퍼가 작을수록 버퍼에서의 패킷손실이 커지는 특성을 가진다.
  • 큐에서 패킷이 대기 중인데 버퍼의 한계를 넘을 경우 패킷이 손실되는 것을 오버플로우(Overflow)가 발생했다고 한다.

 

 

물리적 매체

 

- 비트(bit)는 전송자와 수신자 사이에서 전파된다.

 

- 물리적 링크 : 전송자와 수신자 사이를 연결하는 것

 

- 유선(Wired) 통신에서 신호는 구리나 섬유나 동축(coax) 케이블과 같은 견고한 매체를 통해 전달된다.

 

- Twisted Pair(이하 TP) : 두 개의 절연 처리된 구리선이 꼬여서 만들어진 케이블이다. 꼬임이 클수록 외부의 영향을 덜 받으므로 데이터 전송률이 좋다.

 

- Coaxial Cable(동축 케이블) : 두 개의 중심이 같은 구리선 컨덕터들로 만들어 졌으며, 양방향으로 초고속(broadband) 전송용 케이블이다. 케이블에서 다수의 채널을 이용할 수 있다. 따라서 주파수가 높은 경우에 사용하며, 하나의 전송 매체에 여러 개의 데이터 채널을 제공하기 위해서 이용한다.

 

- Fiber Optic Cable(광섬유 케이블) : 유리섬유로 이루어져 있어서 주파수 신호를 빛의 펄스로 변환시켜 수신측으로 전달하고 수신기가 반대로 번역(펄스->주파수)하는 방식으로 데이터를 전달한다. 잡음에 강하고 방해를 덜 받아 낮은 에러율을 가지기 때문에 데이터를 깨끗하게 전송할 수 있다. 점대점 전송에서는 높은 스피드를 가진다.

 

- 무선(Wireless) 통신에서 신호는 라디오와 같은 매체를 통해 자유롭게 전달된다.

 

- Radio(라디오)

  • 전자기 스펙트럼에서 신호가 이동된다.
  • 양방향으로 데이터를 전달하며 무선방식이다.
  • 전파 환경에서는 반사(reflection), 혼선(interference), 굴절(refraction), 산란(scattering), 물체의 방해에 영향을 받는다.
  • 주파수에 따라 특성이 다양하다.
  • 무선 방식은 공유되기 때문에 성능저하 가능성이 높다.
  • Radio Link Type(라디오 링크 유형)에는 지상파, LAN(ex:wifi), WAN(ex:cellular), 위성통신이 있다. 위성통신에서는 위성이 높을수록 범위가 증가한다. 주로 낮은 고도에 대비하여 지구 정지 궤도에 위치한다. 느리게 돌수록 1인 용량이 줄어들고 수명이 길어진다.

  

 

네트워크의 패킷 손실과 지연이 되는 이유

 

- 라우터 내부의 버퍼인 큐에서 패킷이 도착하기 전에 손실되거나 도착했으나 계속 대기 상태가 되기 때문이다.


- 패킷이 큐에 도착하는 속도가 링크의 수용력(링크의 전송속도)보다 빠를 경우, 큐에 패킷이 쌓이게 되고(지연) 꽉 차서 공간이 없어지면 패킷은 손실된다. , 오버플로우(overflow)가 발생한다.


- 손실된 패킷은 이전의 노드로부터 재전송되어질 수 있다. 이로 인해 네트워크의 트래픽이 증가한다.

 

 

패킷 지연의 네 가지 원인

 

- 처리 지연(Processing Delay) : 노드(host)에서 데이터의 처리(경로설정, 에러 검출 및 정정, 스위칭 등)를 위해 소비하는 시간

 

- 큐잉 지연(Queueing Delay) : 버퍼링 지연이라고도 하며, 패킷이 라우터에 도착하고 다음 목적지로 전송되기까지 큐에서 대기하는 시간.

  • 버퍼(큐 사이즈)의 크기가 클수록 큐잉 지연이 길어지고, 버퍼가 작을수록 버퍼에서의 패킷손실이 커지는 특성을 가진다.
  • 라우터의 혼잡한 정도에 영향을 받는다.

 

- 전송 지연(Transmission Delay) : 어느 노드(host, end system..etc)에서 비트(데이터)를 신호로 바꾸어 특정 링크에 전달하는데 걸린 시간

  • L(bit) / R(bits/sec) -> 패킷의 길이 / 링크의 속도
  • , 데이터의 크기에 비례하고, 링크의 수용력 또는 대역폭에 반비례한다.
  • 링크의 속도가 크다는 것은 한 번에 더 많은 데이터를 링크에 담을 수 있으므로 링크로 데이터를 보내는 시간이 짧아진다. 흔히 파이프 용량이 증가했다고 표현한다.


- 전파 지연(Propagation Delay) : 송신측(Sender)에서 수신측(Receiver)으로 데이터(신호)가 전파될 때 통신 링크 상에서 걸리는 시간

  • D(km) / V(m/s) -> 노드간의 거리 / 전파속도
  • 이 때, 전파속도는 링크의 매체에 따라 다르다. -> optical fiber(광섬유), copper(구리) ..etc

 

Throughput (처리율)

 

- 네트워크 통신에서 노드 간의 전달 또는 파이프 간의 전달되는 단위 시간당 데이터 처리량을 의미한다.


- 데이터 링크에서는 송수신 사이에 비트가 이동하는 속도로 보며, 단위는 초당 비트수(bits per second, bps)가 주로 사용된다.


- 앞의 노드나 파이프의 처리율이 뒤의 것보다 작을 경우, 병목 현상이 발생한다. , 고속도로에서 앞의 차가 느리게 가는 사례와 유사한데, 앞의 차가 느리게 가면 뒤의 차들이 속도를 아무리 내도 전체적인 교통 체증이 증가하는 것이다. 쉽게 말해 앞의 파이프의 속도 하나 때문에 전체 네트워크 시스템이 영향을 받는 현상을 말한다.



 추상 클래스


 - 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 하는 반면, 이 실체 클래스들의 공통적인 속성(필드와 메소드)만 뽑아내어 선언한 클래스를 추상 클래스라 한다.


 - 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없다.

 

 - 추상 클래스와 실체 클래스는 상속의 관계에 놓여있다.


 - 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되며, 실체 클래스는 추상 클래스에 있는 속성 외에 추가적인 속성을 가질 수 있다.


 - 추상 클래스는 새로운 실체 클래스를 위한 부모 클래스의 용도로만 사용된다.



 추상 클래스의 장점


 - 실체 클래스들의 필드와 메소드를 통일하여 실체 클래스 작성 시 시간을 절약할 수 있다.



▶ 추상 클래스의 선언



public abstract class 클래스명 {

//필드

//생성자

//메소드

}




 추상 메소드와 오버라이딩(Overriding)


 - 추상 메소드란 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를  말한다. 끝에는 항상 세미콜론이 있다.


 - 추상 메소드는 추상 클래스에서만 선언할 수 있다.


 - 메소드 실행 내용인 중괄호 블록은 추상 메소드를 상속받은 실체 메소드에서 직접 작성한다.


 - 반드시 자식 클래스는 추상 메소드를 재정의(Overriding)해서 실행 내용을 작성해야 한다.


 - 즉, 추상 클래스를 설계할 때, 하위(자식) 클래스가 반드시 실행해야 하는 메소드를 추상 메소드로 선언하면 된다.



public abstract class Car{

//필드

public int speed;

public String owner;


//생성자

public Car(String owner) {

this.owner = owner;

}


//메소드

public abstract void accelerate(int speed);

public abstract void whatKind();


public void driving() { //모든 자식 객체가 실행하는 메소드

System.out.println("운전 중");

}


}




public class SportCar extends Car{

//필드

int speed;


//생성자

public SportCar(String owner, int speed) {

super(owner);


this.speed = speed;

}


//메소드

@Override

public void accelerate(int speed) {

if(speed > 0) {

this.speed += ( 2 * speed );

}

}


@Override

public void whatKind() {

System.out.println("스포츠카입니다.");

}

}




public class Truck extends Car {

//필드

int speed;


//생성자

public SportCar(String owner, int speed) {

super(owner);


this.speed = speed;

}


//메소드

@Override

public void accelerate(int speed) {

if(speed > 0) {

this.speed += speed;

}

}


@Override

public void whatKind() {

System.out.println("트럭입니다.");

}

}




public class CarTest { //실행 클래스, 객체의 속성을 정의하는 클래스와는 별도로 생성하는 것이 좋다.

public static void main(String[] args) {

SportCar sportCar = new SportCar();

Truck truck = new Truck();


sportCar.whatKind();

truck.whatKind();


sportCar.driving();

truck.driving();


//변수의 자동 타입 변환

Car car = null;

car = new SportCar();

car.whatKind();

car = new Truck();

car.whatKind();

}

}



 

 

* 상속


- 자바에서 상속이란 부모 클래스의 멤버를 자식 클래스에게 물려주는 행위이다.


- 프로그램에서는 자식 클래스가 부모 클래스를 선택하며 클래스명 뒤에 “extends 부모 클래스명를 기술하여 사용한다.


- , 다중 상속은 허용하지 않는다.

 

class 자식클래스명 extends 부모클래스1, 부모클래스2 --> 절대 X

 

- 다른 패키지의 클래스를 상속할 경우 패키지명.클래스명을 import해야한다.

상속의 장점


- 상속은 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다.


- 상속을 이용하여 클래스의 수정을 최소화할 수 있다. , 유지 보수 시간을 최소화한다.


package sec.example;

 

public class A {

int field1;

 

void method1() { ... }    

}

 

public class B extends A { //A를 상속함

String field2;

 

void method2() { ... }

}



 

상속 가능 범위


- 부모 클래스에서 private 접근 제한을 갖는 멤버들(필드와 메소드)은 상속 대상에서 제외된다.


- 부모 클래스와 자식 클래스가 서로 다른 패키지일 때 부모 클래스의 default 접근 제한을 갖는 멤버들도 상속 대상에서 제외된다.


- 그 외에 상속한 클래스의 필드와 메소드는 자식 클래스에서 자유롭게 사용할 수 있다.


B b = new B();

//A로부터 물려받은 필드와 메소드

b.field1 = 10;

b.method1();

 

//B가 추가한 필드와 메소드

b.field2 = "홍길동“;

b.method2();



 

* 부모 생성자의 호출


- 자식 객체를 생성하면, 부모 객체가 먼저 생성되고 그 다음에 자식 객체가 생성된다. 마치, 부모 없는 자식이 없는 것처럼 말이다.


- 부모 생성자는 자식 생성자의 맨 첫줄에서 super() 키워드를 통해 호출된다. 생성자가 명시적으로 선언되지 않았다면 컴파일러는 디폴트 생성자에 super(); 키워드를 맨 앞에 추가하여 생성해 낸다. 여기서 super(매개변수); 는 부모 생성자 역할을 한다.


- super의 매개변수는 부모 생성자의 매개변수의 형태와 동일해야한다.

 

 

* 메소드의 재정의(Overriding)


- 어떤 메소드는 상속받은 자식 클래스에서 사용하기에 부적합할 수도 있다. 이 문제를 해결하고자 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용할 수 있다. , 자식 클래스에서 부모 클래스의 메소드와 동일한 메소드를 재정의하는 것을 말한다.


- 재정의할 메소드 위에는 @Override 키워드가 있어야 한다.


- 메소드가 오버라이딩되면 부모 객체의 메소드는 숨겨지기 때문에 자식 객체에서 메소드를 호출하면 오버라이딩된 자식 객체가 호출된다.


- 그러나 간혹, 숨겨진 부모 객체의 메소드를 사용해야 할 때가 있다면, super 키워드를 이용하여 호출할 수 있다.


 super.부모메소드();



- 메소드 오버라이딩 규칙

  • 부모의 메소드와 동일한 구조(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다.
  • 접근 제한을 더욱 강하게 오버라이딩 할 수 없다.
  • (상속된 부모 객체의 메소드가 default일 때 private로 바꿀 수 없으며, public으로는 가능하다.)
  • 새로운 예외(Exception)throws 할 수 없다.

 


final 클래스와 final 메소드


- 상속할 수 없는 final 클래스 : 클래스 선언 시 아래와 같이 class 앞에 final 키워드를 붙이게 되면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다. , final 클래스는 부모 클래스가 될 수 없다.


public final class 클래스명 { ... }



- 오버라이딩(Overriding)할 수 없는 final 메소드 : 메소드를 선언할 때 final 키워드를 붙이게 되면 이 메소드는 최종적인 메소드가 되므로 오버라이딩할 수 없는 메소드가 된다. , 부모 클래스에서 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다.


public final 리턴타입 메소드(매개변수) { ... } //해당 메소드 재정의 불가




* protected 접근 제한자


- 부모 클래스의 멤버가 protected 접근 제한자를 가질 경우 자식 클래스는 다른 패키지라도 부모 객체의 필드, 생성자, 메소드를 사용할 수 있다.


- 생성자의 경우, 부모 객체를 new 연산자로 생성하는 것이 아니라 자식 클래스의 생성자에서 super(); 키워드를 통해서 호출할 수 있다.

 

 

* 타입 변환과 다형성


- 다형성은 하나의 타입에 여러 객체를 대입하여 이용할 수 있는 성질을 말한다. 이러한 다형성을 위해 자바는 자식 클래스에서 부모 클래스로 자동 타입 변환하는 것을 허용한다. , 부모 타입에는 모든 자식 객체가 대입될 수 있다.

 

만약 Car 클래스를 상속하는 SportCar 클래스가 있다면,


SportCar mySportCar = new SportCar();

Car myCar = mySportCar; //자동 타입 변환


mySportCar 변수와 myCar 변수는 타입만 다를 뿐 동일한 객체(SportCar)를 참조한다.


- 매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체 외에 상속받는 자식 객체까지도 매개값으로 사용할 수 있다.


- , 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근할 수 있다. , 변수는 자식 객체를 참조하더라도 해당 변수로 접근 가능한 멤버는 부모 클래스의 멤버로 제한된다.


- 그러나 메소드가 자식 클래스에서 오버라이딩 되었다면 부모 타입으로 자동 타입 변환되어도 오버라이딩된 메소드가 호출된다.


- 바로 위의 부모 클래스가 아니더라도 상속 계층에서 상위 타입이라면 하위 타입이 자동 타입변환 된다.

- 강제 타입 변환(Casting) : 자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식타입으로 변환할 때 강제 타입 변환을 해야 한다. 즉, 부모 타입에 부모 객체가 아닌 자식 객체가 있는 경우에 가능하다.

 

자식클래스 변수 = (자식클래스) 부모클래스;

 

 

* 객체 타입 확인


- 강제 타입 변환은 자식 타입이 부모 타입으로 변환되어 있는 상태에서만 가능하므로 부모 타입의 변수가 부모 객체를 참조할 경우 자식 타입으로 변환할 수 없다.


- instanceof : 위의 문제점을 해결하고자 어떤 객체가 어떤 클래스의 인스턴스(객체)인지 확인하는데 사용되는 연산자이다. 


boolean result = 좌항(객체) instanceof 우항(타입);



- 해당 타입이면 true, 아니면 false를 리턴한다.


// Child extends Parent

// Child -> Parent (자동타입변환)

// Parent -> Child (캐스팅)

 

public void method(Parent parent) {

Child child1 = new Child();

Parent parent = child1;


//parent 변수가 참조하는 객체는 Child 클래스의 인스턴스(객체)인가?

if(parent instanceof Child) {

    Child child = (Child) parent

    }

}




 



* 인스턴스(instance) 멤버 : 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말한다. 이들은 각각 인스턴스 필드, 인스턴스 메소드라고 부른다. 인스턴스 멤버는 객체 소속된 멤버이기 때문에 객체 없이는 사용할 수 없다.

 

 - 외부 클래스에서 인스턴스 멤버로의 접근 : 외부에서 접근할 때는 객체의 주소가 들어간 참조 변수에 도트 연산자(.)를 통해 접근할 수 있다.

 


Car myCar = new Car(); //객체 생성

myCar.speed = 10; //도트 연산자를 통한 해당 객체의 인스턴스 필드로 접근


 

인스턴스 필드는 heap영역에 객체마다 따로 존재하고, 인스턴스 메소드는 객체 마다 존재하지 않고 메소드 영역에 저장되고 공유된다. 변수는 스택(Stack) 영역에 저장되고 참조 변수일 경우 스택 영역에서 힙 영역에 있는 객체의 주소를 가리킨다.

 


 - 해당 클래스에서 인스턴스 멤버로의 접근

객체 내부에서도 인스턴스 멤버에 접근하기 위해서는 this를 사용할 수 있다. , 객체는 자신을 “this"라고 한다. 따라서 this.필드명 = 데이터; 은 자신이 가지고 있는 필드에 데이터를 대입하는 것이다. 또는 this.메소드명(); 은 자신이 가지고 있는 메소드를 실행하는 것이다.

this를 사용하는 이유는 주로 생성자와 메소드의 매개 변수 이름이 해당 객체의 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하기 위해서이다.

 


Car(String model) { //생성자

    this.model = model;

}

 

void setModel(String model) { //메소드

    this.model = model;

}




* 정적(static) 멤버 : 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 의미한다. 이들은 각각 정적 필드, 정적 메소드라고 부른다. 정적 멤버는 객체에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라 부르기도 한다. 따라서 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 영역에 추가할 때 클래스별로 관리된다. 클래스의 로딩이 끝나면 바로 사용할 수 있다.

 

- 정적 멤버 선언 : 선언 시 static 키워드를 추가적으로 붙이면 된다.

 


public class 클래스명 {

//정적 필드

static int field1 = 10;

 

//정적 메소드

static 리턴타입 method1(int parameter) { .... }

}


- 정적 멤버 사용 : 클래스 이름과 함께 도트 연산자(.)로 접근한다. 원칙적으로는 클래스 이름으로 접근해야 하지만 객체 참조 변수로도 접근이 가능하다.

클래스명.필드;

클래스명.메소드();

참조변수명.필드;

참조변수명.메소드();

 

- 정적 초기화 블록 : 정적 필드는 객체 없이도 사용해야 하므로 객체 생성 시에만 실행되는 생성자에서는 초기화 할 수 없다. 따라서 정적 블록(block)을 제공한다.

 


static { //정적 블록

    ...

}


정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다. 정적 블록은 클래스 내부에서 여러 개 선언되어도 상관없다. 선언된 순서대로 실행된다.

, 정적 블록 안에 객체 자신의 참조인 this키워드와 인스턴스 멤버를 절대 사용할 수 없다.

? 객체가 없어도 실행되기 때문이다.

 


public class 클래스명 {

static int info;

static String str;

 

static {

info = 100;

str = "안녕“ + "하세요.”;

      }

}


 

 

- 구분필드 선언 시 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하고, 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다.

메소드 선언 시 인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드를 선언하고, 인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언한다.

 

 

* 싱글톤(Singleton) : 전체 프로그램에서 단 하나의 객체만 만들고 싶은 경우에 이용된다. , 싱글톤은 단 하나만 생성되는 객체이다. 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. , 생성자의 앞에 private라는 접근 제한자를 붙여주면 된다. 접근 제한자는 뒤에서 배울 것이다.

 

- 싱글톤 사용방법 : 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성하여 초기화한다. 클래스 내부에서는 new 연산자 사용이 가능하다. 정적필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하게 한다.

 


public class 클래스명 {

//정적 필드

private static 클래스명 변수이름 = new 클래스();

 

//생성자

private 클래스명() { ... }

 

//정적 메소드

static 클래스명 정적메소드명() { //메소드이름은 getXXX로 하는 것이 좋다.

       return 변수이름

}

}


외부에서 객체를 얻기 위한 방법은 싱글톤 객체 내부에 있는 정적 메소드를 호출하는 것이다. 여기서 정적메소드는 단 하나의 객체만 리턴하기 때문에 다른 변수에서 호출해도 같은 객체를 가리키는 것이다.

 

클래스 변수1 = 클래스.정적메소드명();

클래스 변수2 = 클래스.정적메소드명();

 

변수1과 변수2같은 객체의 번지를 참조한다.

 

 

* final 필드와 상수(static final)


 - final 필드 : 최종적인 필드라는 의미로, final 필드는 초기값이 저장되면 바꿀 수가 없으므로 프로그램 내에서 수정이 불가능하다.

 - final 필드 선언 : 선언과 동시에 초기값을 주거나 생성자를 통해서 주는 방법 두 가지만 가능하다. 또한 final은 초기화되지 않을 경우 컴파일 에러가 발생한다.

 ex) 아이디나 주민등록번호와 같은 데이터를 저장할 때 사용된다.

 - final 적용 범위 : 필드, 메소드(해당 클래스 상속 시 오버라이딩 불가), 클래스(타 클래스 상속 불가)

 

 - 상수(static final) : 변하지 않는 데이터를 의미한다.

 - 상수의 선언 : 일반적으로 선언과 동시에 초기화하지만 복잡한 초기화일 경우 정적 블록을 통해 이루어지기도 한다. 상수의 이름은 모두 대문자로 작성하는 것이 관례이다.

ex) 원주율과 같은 데이터를 저장할 때 사용된다.

 - 상수의 범위 : 필드, 메소드(해당 클래스 상속 시 오버라이딩 불가), 초기화 블록(클래스가 초기화될 때 수행되고, main()함수보다 먼저 실행된다.)


 - 상수(static final)final은 유사해보이지만 엄연히 다르다.

final 필드는 객체마다 저장되고, 생성자의 매개값을 통해서 여러 가지 값을 가질 수 있지만, 상수는 객체마다 저장할 필요가 없기 때문에 클래스의 모든 객체가 공유하게 되는 공용성을 띄므로 객체를 생성하지 않아도 사용할 수 있다, 또한 불변의 값이므로 여러 가지 값으로 초기화될 수 없다. 상수를 클래스 변수라고 부르며, 클래스에 속한다고 표현한다.

 

 

* 패키지(package) :물리적인 형태는 파일 시스템의 폴더로 컴파일 과정에서 자동적으로 생성되는 폴더이다, 패키지는 클래스를 유일하게 만들어주는 식별자 역할을 한다. 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다.


- 패키지 선언 클래스의 첫 줄에 선언한다. 패키지의 계층을 구분할 때 도트 연산자(.)를 사용한다. , 이클립스는 선언이 없는 패키지를 default 패키지에 포함시킨다.

 


package 상위패키지.하위패키지; //패키지 선언


 

- 패키지 작성 규칙

  • 숫자로 시작해서는 안 되고, _, $를 제외한 문자를 사용해서는 안 된다.
  • java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용해서는 안 된다.  ex) java.awt.event;
  • 모두 소문자로 작성하는 것이 관례이다.

 

- 다른 패키지의 사용

첫 번째 방법은 패키지와 클래스를 모두 기술하는 것이다. 서로 다른 패키지에 동일한 클래스 이름이 존재하고, 두 패키지가 모두 import되어 있을 경우에는 꼭 필요한 방법이다.

 


//com.hankook패키지의 Tire클래스를 이용해서 필드를 선언하고 객체를 생성한 것이다.

com.hankook.Tire tire = new com.hankook.Tire();


 

두 번째 방법은 사용하고자 하는 패키지를 import문으로 선언하고, 객체를 생성할 때는 패키지명을 생략하는 것이다. , import 문이 작성되는 위치는 패키지 선언과 클래스 선언사이이다.

 


package com.mycompany;

 

import com.hankook.Tire;

// 또는 import com.hankook.*;

//여기서 *는 해당 패키지내의 모든 클래스를 import한다는 의미이다.

 

public class Car {

Tire tire = new Tire();

} 


주의할 점은 import 문으로 지정된 패키지까지만 허용된다. , 지정된 패키지의 하위 패키지의 클래스를 사용하고 싶다면 import문을 하나 더 사용해야 한다.

 

 

* 접근 제한자


 접근 제한자

적용 대상 

접근가능한 클래스 

public

클래스, 필드, 생성자, 메소드 

모두 허용 (다른 패키지 ok)

protected 

필드, 생성자, 메소드

다른 패키지라도 자식 클래스(상속)까지 허용

default

클래스, 필드, 생성자, 메소드 

같은 패키지에 소속된 클래스

private

필드, 생성자, 메소드

같은 패키지라도 해당 클래스만 허용


 - 접근 제한 정도 : public < protected < default < private

 - 접근 가능 범위 : public > protected > default > private



* 메소드(Method)


 - 일반적으로 객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다. 이는 정보 은닉이라는 특성이 있기 때문이다. 즉, 외부에서 변경할 경우 객체의 무결성이 깨어질 수 있기 때문이다.

 - 주로 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경한다.

 - Setter 메소드는 setXXX(매개변수) 로 메소드 이름을 짓는 것이 관례이며, 외부에서 해당 객체의 데이터에 접근할 때 사용하는 메소드이다. 메소드는 매개값을 검증해서 유효한 데이터만 받아들일 수 있기 때문이다.


void setSpeed(double speed) { // 데이터를 설정하므로 리턴값이 없기 때문에 리턴 타입은 void로 한다.

if(speed < 0) {

this.speed = 0;

return;

} else {

this.speed = speed;

}

}



 - Getter 메소드는 getXXX() 로 메소드 이름을 짓는 것이 관례이며, 외부에 해당 객체의 데이터를 전달할 때 사용하는 메소드이다. 주로 필드값을 가공한 후 외부로 전달한다.


double getSpeed() { //전달할 데이터에 맞는 리턴타입을 써야한다.

double km = speed * 1.6;

return km;

}



 - 단, 필드 타입이 boolean인 데이터에 접근할 때는 Getter 메소드는 getXXX()의 형태가 아닌 isXXXX()로 시작하는 것이 관례이다.


private boolean stop;


//Getter

public boolean isStop() {

return stop;

}


//Setter

public void setStop(boolean stop) {

this.stop = stop;

}



* 이클립스에서는 필드 선언 후 메뉴에서 [source → Generate Getters and Setters] 를 선택하면 자동으로 만들어진다.

+ Recent posts