1. 객체지향의 다섯 개의 개념

 

객체란 객체지향 프로그램을 작성하는데 사용되는 것들이다.

객체지향은 어떠한 목적을 이루기 위해 협업하도록 구성 되어지는 객체들의 집합이다.

객체지향은 아래와 같이 5가지의 기반 개념으로 나눌 수 있다.

 

1) Objects //객체

2) Classes //클래스

3) Encapsulation //캡술화

4) Inheritance //상속

5) Polymorphism //다형성

 

//2345번은 아래의 과제에 있으니 생략

객체에 대해서 더 자세하게 설명하자면

모든 객체는

-데이터를 가지고 있다.

데이터는 각 객체들의 상태를 기술하는 정보를 가지고 있다.

 

-행위의 집합을 알고 있다.

행위란 객체가 메시지를 받았을 때 어떠한 작동을 해야하는지 알고있는 것입니다.

 

-개체를 구분하는 아이덴티티를 가지고 있다.

하나의 객체를 다른 객체와 구분하는 것을 가능하게 합니다.

 

간단하게 이렇게 설명할수 있습니다.

 

2.패키지 클래스 인스턴스

 

패키지 패키지란 비슷한 클래스들을 묶어놓은 집합체이다.

 

package Java;

public class Daeduck{}

 

또는

package Java;

public class Soft_ware{}

 

이러한 형식으로 선언된 클래스들을 사용하기 위해서는

import Java.Daeduck;

으로 다른 클래스에서 import할 수 있습니다.

 

또는 다음과 같이 *기호로도 이용 할 수 있습니다.

import Java.*

 

*을 사용하면 Java패키지내의 모든 클래스를 import합니다.

 

클래스 클래스는 객체 생성의 Blueprint입니다. (Blueprint란 아키텍쳐 또는 공학 설계를 문서화한 기술 도면을 인화하거나 복사한 도면이라고 정의합니다.)

또는 데이터와 함수의 집합이다.

클래스는 객체가 소유하게 될 속성(attributes)과 행위(behaviors)를 정의합니다.

 

변수 -> 배열 -> 구조체 -> 클래스

클래스를 이용해 다량의 데이터를 보다 쉽게 다룰 수 있습니다.

 

새로운 클래스를 생성하는 일은 두분으로 나뉜다.

 

1. 객체의 상태를 저장하는데 사용될 속성을 정의 합니다.

 

2. 객체가 이해할 수 있는 메세지와 메세지에 응답하는 과정을 정의 합니다. 각각의 메세지에 대해 메소드(method)라고 불리우는 프로시저를 만들고, 이것을 구현합니다.

 

인스턴스 - 인스턴스란 클래스의 정의를 통해 만들어진 객체를 의미하는 것이다.

class Test {

Person p1; // Person 타입의 객체

p1 = Person(); // 인스턴스

}

 

/*

클래스 : 설계도

인스턴스 : 제품

/

!!!클래스를 인스턴스화 할 때는 변수에 담아야 한다는 것과 이 때 사용하는 변수의 데이터 타입은 그 클래스가 된다는 점이다.!!!

 

 

 

 

 

 

3 상속

 

동물과 개의 상속관계로 나타 내보았다.

 

Animal.java

public class Animal {

String name;

 

public void setName(String name) {

this.name = name;

}

}

 

Dog.java

public class Dog extends Animal {

 

}

이렇게 선언하게 된다면 Dog클래스는 Animal 클래스를 상속했다고 말할 수 있다.

Dog클래스에는 name이라는 변수와 setName이라는 메소드를 선언하지 않았지만 Animal클래스를 상속했기에 선언이 되어있지 않아도 사용이 가능하다.

 

상속의 특징을 정리하자면

1. 하위 클래스는 상위 클래스에 있는 모든 public으로 지정한 인스턴스 변수와 메소트를 상속합니다. 하지만 private로 지정한 인스턴스변수와 메소드는 상속하지 않습니다.

 

2. 다중상속이 불가능하다

2개이상의 클래스를 한번에 상속할 수 없습니다.

 

3. 동일한 이름의 변수가 부모클래스와 자식클래스 두 개다 존재한다면 부모클래스의 변수는 가려집니다.

즉 부모클래스의 변수<자식클래스의 변수 (자식클래스의 변수가 더 우선입니다.)

 

4. 부모의 생성자는 상속되지 않습니다.

 

4.캡슐화

 

캡슐화란 객체지향의 가장 기본이 되는 원칙이다.

 

캡슐화란 자세한 내부구현을 외부에 드러내지 않고 숨기는 것이라고 할 수 있다.

 

 

캡슐화를 하게 되면 내부에 데이터를 어떻게 저장하는 지, 그 데이터를 어떻게 처리하는 지, 또는 특정 기능을 어떻게 제공하는 지에 대한 내용은 드러내지 않는다.

객체가 어떤 기능을 제공하는지만 공유 할 수 있다.

예를 들면 계산기에서 어떤 타입의 변수를 사용하는지 어떻게 구현했는다의 정보는 외부로 들어내지 않고

곱하기, 나누기, 더하기, 빼기 등의 기능만 제공하는 것이다.

캡슐화를 하게 되면 기능을 변경해야 하는 상황이 발생할 경우 특정 클래스로만 변화가 수렴되는 특징을 갖게 된다.

 

캡슐화방법

//일반적인 변수선언방법

int x;

int y;

//캡슐화시킨 변수선언

private int x;

private int y;

 

5. 메시지의 개념을 이해하고 예를 들어 구체적으로 설명하시오.

메시지 정의 : 객체에 일을 시키는 행위. 각각의 객체는 모두 메시지를 통해

다른 객체와 통신, 상호작용을 한다. parameter의 형태로 전달이 된다.

 

ex)

Sum.plus(10);

 

Sum : 메시지를 받는 객체.

plus : 메시지의 이름

10 : 매개변수

 

6. 추상화의 개념

 

추상화의 정의 : 프로그래밍 입장에서의 추상화는 데이터들의 공통적인 특징을 뽑아내는 것이다. 꼭 객체지향 언어만이 아니라 절차지향 언어에도 존재하는데, c언어에서의 구조체가 바로 그것이다. c언어에서의 구조체라면, java언어 등 객체지향 언어에서는 class를 정의 하는 것이 추상화라고 할 수 있겟다.

 

추상 클래스 : 완성되지 못한 class를 말한다. 추상 클래스 자체는 class로써의 역할으르 못하지만, 조상 class로써의 중요한 의미를 갖는다.

 

선언법 :

abstract class NAME {

...

}

 

추상 메서드 : method는 선언부, 구현부로 나뉘는데 선언부만 작성해 놓은 method를 말한다.

 

선언법 :

abstract RETURNTYPE NAME ();

 

여기서, abstract를 굳이 사용하는 이유는, 자손 class에서 추상method를 반드시 구현하도록 하기 위해서이다. 만약, 추상 method를 정의되어있지 않다면, 상속을 받는 자손 class는 추상 method가 아닌 모두 다 구현된 method로 판단하고 오버라이딩을 통해 자신에 맞춰서 구현하지 않을 수 있기 때문이다.

 

ex)

요즘 학생들이 즐겨하는 게임에 나오는 챔피언들을 class로 만들어 보았다.

 

class Katarina {

int x, y; //위치

void move(int x, y)//이동위치

void stop()

void Death Lotus ();

}

 

class Blitzcrank {

int x, y; //위치

void move(int x, y)//이동위치

void stop()

void StaticField();

}

class Draven {

int x, y; //위치

void move(int x, y)//이동위치

void stop()

void WhirlingDeath()

}

 

이를 공통부분으로 뽑아내 추상class로 만들고, 상속받도록 변경을 해보면,

 

abstract class ChampMove {

int x, y; //위치

abstract void move(int x, y);//이동위치

abstract void stop();

}

 

class Katarina extends ChampMove{

void move(int x, int y)

void Death Lotus ()

}

 

class Blitzcrank {

void move(int x, int y)

void StaticField();

}

class Draven {

void move(int x, int y)

void WhirlingDeath()

 

 

위와 같이 쓸 수 있을 것이다.

 

7. 다형성의 개념

다형성이란, 부모의 객체에 자녀를 담는 것이다. 부모의 객체를 자녀로 생성하였을 경우에는 부모의 변수만 사용할 수 있다.

 

 

 

 

ex)

class cl1 {

 

String x = "부모";

String y = "부모";

 

}

 

class cl2 extends cl1{

 

String y = "자녀";

String z = "자녀";

 

}

 

public class exam01 {

 

public static void main(String[] args) {

 

cl1 tset1 = new cl1();

System.out.println(tset1.x);

System.out.println(tset1.y);

cl2 tset2 = new cl2();

System.out.println(tset2.x);

System.out.println(tset2.y);

cl1 tset3 = new cl2();

System.out.println("다형성 규칙에 의하여 부모클래스에 있는 : " +tset3.x);

System.out.println("다형성 규칙에 의하여 부모클래스에 있는 : " +tset3.y);

 

}

 

}

 

실행결과

부모

부모

부모

자녀

다형성 규칙에 의하여 부모클래스에 있는 : 부모

다형성 규칙에 의하여 부모클래스에 있는 : 부모

 

무조건 부모의 것을 사용하여야 하는 이유는 객체를 하나로 통일시키기 위해서이다.

, object객체를 이용한다면, 무조건 부모의 변수를 사용하지 않아도 된다.

 

출처 :

http://cafe.naver.com/breakjava/49

 

http://cafe.naver.com/gisdev/461

 

http://cafe.naver.com/breakjava/49

 

https://wikidocs.net/280

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

자바 프로그래밍 쓰레드(Thread)#1  (0) 2015.10.02

Thread

이번에는 쓰레드에 대해서 공부해 보겠다.

컴퓨터 내에서 동작하고 있는 프로그램을 프로세스(Process)라고 한다. 

평균적으로 한 개의 프로세스는 한 가지의 일을 하지만, 쓰레드를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 실행 할 수있게 된다.

public class First_Thread extends Thread { public void run() { System.out.println("thread run."); } public static void main(String[] args) { First_Thread test = new First_Thread(); test.start(); } }

Test클래스가 Thread를 상속한 상태이다.

Thread 클래스의 run 메소드를 구현하여 예제와 같이 test.start() 실행 시 test객체의 run 메소드가 수행이 된다. 

여기서 public class Test extends Thread 에서 extends를 선언하였기때문에 start 메소드를 실행시 자동으로 run이라는 매소드를 실행하게된다.

하지만 위의 예제 하나로는 쓰레드가 어떻게 실행되는지를 확실하게 확인할수 없다.

시import java.util.Scanner;

public class Thread_first extends Thread {
public void run() {
int i = 0;
System.out.println("Start Thread"); //Thread가 실행을 알려준다
while (true) {
System.out.println("Thread: "+i);//Thread는 3초마다 1을 증가시켜 출력시킨다
try {
Thread.sleep(3000);
} catch (InterruptedException e) {

e.printStackTrace();
}
i++;
}
}

public static void main(String[] args) {
Thread_first test = new Thread_first();
Scanner s = new Scanner(System.in);
String ch = "Thread Start";
String in = null;

int i = 0, j = 0;
while (true) {
try {
System.out.println("Main: "+i);//Main은 1초마다 1씩증가 시켜서 출력한다.
i++;
Thread.sleep(1000);
if (j == 0) {
in = s.nextLine(); //입력
j++;
}
if (ch.equals(in)) { //입력이 ch에 저장되어있는 "Thread Start"와 같으면 Thread를 실행시키다.
test.start();
}

} catch (Exception e) {
}

        }
}

}

위 예제를 실행해보면 쓰레드와 메인둘다 실행이 되어있다는 것을 확인할수 있다. 하지만 아직도 쓰레드와 메인이 별개로 움직인다는 것을 확실하게 파악하기는 힘듭니다.

다음예제를 봅시다.

public class Thread_first extends Thread {
public void run() {
for(int i=0;i<10;i++){ //Thread에서는 1~10까지 출력
System.out.println("Thread : " + i);
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Thread END");
}

public static void main(String[] args) {
Thread_first thread = new Thread_first();
thread.start();
for(int i=0;i<5;i++){ //Main에서는 1에서 5까지 출력    
System.out.println("Main : " + i);
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Main END");
}

}

위 예제를 실행하면 메인과 쓰레드는 별개로 돌아가고 있다는 것을 확인할수 있습니다.

실행결과

Main : 0 Thread : 0 Main : 1 Thread : 1 Main : 2 Thread : 2 Main : 3 Thread : 3 Main : 4 Thread : 4 Main END Thread : 5 Thread : 6 Thread : 7 Thread : 8 Thread : 9 Thread END

실행결과를 보면 5값이 출력되면서 메인은 종료가 된것이 보인다.
하지만 메인이 종료되었어도 쓰레드는 계속해서 돌아가고 있는 것이보인다. 이를 통해 메인과 쓰레드는 별개로 돌아간다는 것을 확인하였다.


'프로그래밍 언어 > JAVA' 카테고리의 다른 글

자바 객제지향  (0) 2016.07.18

+ Recent posts