본문 바로가기

공부하자

객체와 클래스

객체란?

객체 : 실 세계에 존재하는 모든것(개념+실체)중에서 작업하려는 프로그램에 필요하는
속성과 행위를 갖는 객체를 뽑아 객체와의 연관 관계를 맺음으로서 프로그램을 완성할 수 있는
부품과 같은 존재.
객체 : 속성(Data=> variable) + 행위(method)

클래스란?

클래스 : 객체를 생성하도록 객체가 갖고 있는 속성과 행위를 선언해 놓은 것(공장)
 ▲ 클래스 선언

[modifier] class className{

 //속성 (Attribute)선언

 [modifier] DataType  id;

 

 //생성자(Contructor)선언

 

 //행위(Method)선언

 [modifer] return_type  methodName([argument-list]){

..............

 }

}

 

ex)

Person{

//속성 : name, age, gender,ssn,job
//행위 : eat(), sleep(), study()

public class Person

{

public String name;
public int age;
public String gender;
public String ssn;
public String job;
public void eat( String menu ){ 
System.out.println(menu+" 를 잘 먹었네~~");

}

public  int sleep(int start, int end)

{

   return end- start;

}

public void study(String subject, int time)

{
   System.out.println(time+" 시간동안 "+ subject+" 를 공부했네~");

}

}

 

객체 생성 

  - 선언 :   ClassName  id;  or      ClassName id=null;
  - 생성 :   id = new ClassName();
  - 객체의 속성 접근 :     id.Variable = value;
  - 객체의 메소드 호출:    id.method(~);
  - 객체를 선언만 하고 생성하지 않은 상태에서 속성이나 메소드에 접근하면
    NullPointerException 발생
  - 선언&생성 : ClassName id = new ClassName();

ex)

public class PersonTest{

public static void main(String[] args){

Person p =null;
p = new Person();
p.name = "tmax";
p.eat("우유");
Person p2 = new Person();
p2.name="tamx2";
p2.study("자바",10);

}

}

  VM이 관리하는 메모리 영역 : 동적으로 메모리를 관리
  Method 영역 : 프로그램을 실행하면 class가 메모리에 올라가는데
                   Method영역에 class들이 올라가서 PC(program counter)가 참조하면서
     프로그램을 실행시킨다.
  Stack 영역 : 모든 선언한 변수가 Stack에 올라간다. 
  Heap 영역 : 생성된 객체가 heap에 올라간다.

 

생성자

생성자 : 객체를 생성시켜준다.

- new : heap에 객체가 올라갈수 있도록 메모리만 할당
- 생성자 : new에 의해 heap에 메모리를 할당 받아 객체를 생성하고 
           객체가 가진 모든 속성에 기본값으로 초기화시켜준다. 
- 생성자 규칙

1. 반드시 클래스 이름과 동일 해야 한다. 
2. 모양은 메소와 비슷하지만 returnType이 없다.
   - default 생성자 : argument가 없는  default생성자
     만약 class에 생성자가 하나도 없다면 Compiler가 default생성자를 만들어준다.
     => class에 생성자가 하나이상 있다면 Compiler는 default생성자를 만들지 않는다.

 

this

this:  this를 사용한 클래스로부터 생성된 객체를 지시한다.

- 속성(MemberVariable)과 LocalVariable을 구분할때 
- 생성자에서 같은 클래스의 argument가 다른 생성자를 호출할때 
ex) Account.java 참조하기


OOP(Object Oriented Program) 특징

Encapsulation (캡슐화)

데이터 보호

데이터 은닉

 

inheritance (상속)

  • 자식 Class에서 부모 Class의 멤버 변수, 메소드를 상속 받을 수 있다.

  • 멤버 변수, 멤버 메소드는 그대로 상속되지만 생성자는 그대로 상속받지는 못하고 호출함으로서 사용할 수 있다.

  • Super Class에서 정의된 기능(멤버변수,메소드 등)을 Sub Class에서 구현하려고 할때
    Super Class를 상속받음으로서 그 기능을 그대로 사용할 수 있다

  • 상속법

Super Class : class [클래스 명]

Sub Class : class [서브 클래스 명] extends [슈퍼 클래스 명]

  • 상속 관계에서 Subclass에서 Superclass로는 자동 형변환이 되지만
                        Superclass에서 Subclass로는 자동 형변환이 되지 않는다.

 

 

Polymorphism (다형성)

한가지 데이터 타입이 여러개의 형을 갖는다

  • 다형성은 상속 관계에서 형성된다.

  • Super Class Type의 참조변수(Reference Variable)가 Subclass의 객체를 참조 할 수 있다.

  • 업캐스팅(UpCasting)

    서브 클래스 객체가 슈퍼클래스 객체로 형변활 될때 자동으로 형이 변환된다.

  • 다운캐스팅(DownCasting)

    슈퍼클래스 객체가 서브 클래스 객체로 형변환될 때 반드시 형변환을 해야한다.

    ※ 슈퍼클래스가 참조하는 객체로만 형이 변환되고 다른 객체일 경우 런타음시 ClassCastException이 발생한다.

 

Employee e = new Employee();    //가능

e = new Engineer();                     //가능

e = new Manager();                     //가능

 

Engineer en = new Engineer();                  //업 캐스팅

Employee e = en;                                     //가능

 

Employee e = new Engineer();                  //다운캐스팅

Employee  en1=(Engineer)e;                   //가능

Manager m1=(Manager)e;                     //불가능강제형변환으로 컴파일은 가능하지만 Engineer로 형성된 e를 manager로 변환은 불가능

 

예제)

다형성의 활용 예제 1 -> PolymorphismTest

다형성의 활용 예제 2 -> 사용 안 한 예제 : ArrayNonPolylest.java

  사용 한 예제    : ArrayPolylest

 

 

OOP 특징 - 네이버 지식인

일반적으로 소프트웨어 시스템은 복잡한 많은 업무 분야의 문제를 해결해야 합니다. 하지만 한 사람의 머리로는 한꺼번에 복잡한 모든 문제를 파악할 수도 없고 해결할 수는 더더욱 없습니다. 그래서 구조적 방법론에서는 사람이 이해할 수 있는 작은 단위로 나누어서 해결하려고 합니다. 따라서 '나누어서 정복한다(divide and conquer)'는 것이 구조적 방법론의 모토가 되는 것이지요. 객체지향 방법론에서의 문제 해결 방법은 추상화(abstraction),캡슐화(encapsulation),모듈성(modularity),계층성(hierarchy)라는 4가지 개념으로 요약할 수 있습니다.

추상화

복잡한 많은 업무를 관리해야 할 때 중요하지 않은 세세한 것 까지 일일이 신경 쓸 필요는 없을 것입니다. 그보다는 오히려 보다 중요하고 필수적인 사항만을 다루는 것이 바람직할 것입니다. 이것을 객체지향 방법론에서는 추상화라고 합니다.
그러나 여기서 주의해야 할 것은 무엇이 중요하고 무엇이 덜 중요한 것인가를 판단하는 일입니다. 어떤 업무에서는 중요한 것이 다른 업무에서는 전혀 중요하지 않은 것일 수도 있으며, 그 반대의 경우도 있을 수 있습니다. 또는 같은 업무라고 하더라도 어느 관점에서는 중요한 것이 다른 관점에서는 덜 중요한 경우도 있을 수 있습니다. 그 판단은 많은 경우에 있어서 경험의 문제일 수도 있습니다. 만약 분석가 또는 설계자가 해당 업무 분야에 대하여 많은 경험을 갖고 있다면 쉬게 판단할 수도 있을 것이기 때문입니다. 그렇지 않다면 경험이 많은 업무 당당자를 빨리 찾아서 도움을 요청해야겠지요.

캡슐화

아마 여러분은 굳이 텔레비전의 내부를 뜯어보지 않아도 리모콘을 통해 텔레비전을 사용할 수 있을 것입니다. 또는 자동차가 어떻게 작동하는 지 알지 못해도 운전하는 방법만 알고 있다면 자동차를 운전할 수 있을 것입니다. 설사 여러분이 운전을 할 수 있다고 하더라도 실제로 자동차의 엔진 내부를 뜯어본 사람은 별로 없을 것입니다. 엔진은 자동차에게서 가장 중요한 부품이 아닙니까? 오히려 엔진 내부를 뜯어봤다면 아마도 그 자동차는 제대로 작동하지 않을 지도 모르죠. 자동차 정비소에서 엔진을 한번 볼 기회가 있었는데 캡슐같이 생긴 통안에 머리카락이라도 보일까봐서 아주 깊숙히 꼭꼭 숨어있더라고요. 이렇게 꼭꼭 숨어있다고 하더라도, 그것이 엔진이 어떻게 작동되는 지 세부적인 사항을 알지 못하더라도 우리는 이 엔진을 손쉽게 작동시킬 수 있습니다. 자동차가 제공하는 엑셀레이터를 통해서 말이죠. 이것이 객체지향 방법론에서 말하는 캡슐화라고 하는 것입니다.말 그대로 중요하고 세부적인 구현 방법에 대한 자세한 사항은 캡슐 안에 꼭꼭 숨겨놓는 것입니다. 자동차에게 중요한 것이 엔진이라면 소프트웨어 시스템에게 있어서 중요한 것은 데이터입니다. 그래서 캡슐화를 데이터 감추기(data hiding)라고도 하는 것이지요.

인터페이스

그런 후에는 마치 자동차의 엑셀러레이터를 통해서 엔진을 작동시키는 것과 같이, 데이터를 조작할 수 있는 방법을 외부에 제공하게 되는 것이지요. 이와 같이 외부에 노출시켜 제공하는 방법들을 인터페이스(interface)라고 합니다. 약간의 차이는 있지만 일반저으로 한 자동차를 운전하는 방법을 알고 있다면 부명히 다른 자동차를 운전할 수 있을 것입니다. 이것은 자동차가 제공하는 운전이라고 하는 인터페이스가 같기 때문입니다.

다형성

TV가 인터페이스를 어떻게 구현했느냐에 따라 화질이 달라질 수도 있습니다. 화질이 좋지만 값이 비싼 TV도 있을 수 있고, 화질은 별로 좋지 않지만 값이 싼 TV도 있은 것처럼 말입니다. DVD는 같은 방법으로 TV에게 영상 정보를 받으라고 메시지를 보내는데 TV 에 따라서 서로 다른 화질의 결과를 보여주는 것이지요. 이것을 다형성(polymorphism)이라고 하는 것입니다. 이처럼, 인터페이스는 다형성의 원리에 기초하고있는 것입니다.

계층성(상속성)

여러 개의 조각으로 나누다 보면 어떤 조각을은 서로 비슷한 특성이나 기능을 가질 때가 있습니다. 예를 들어 승용차, 승합차, 화물차 등의 조각들이 있다고 한다면, 우리는 이들 조각들에게서 비슷한 특성이나 기능들을 발견할 수 있게 됩니다. 차체, 엔진, 바퀴, 스티어링, 엑셀러레이터, 브레이크 등과 운전방법, 이런 것들은 자동차라면 모두 갖게 되는 특성이나 기능입니다. 승용차는 여기에 승차인원이 5명까지로 제한된다는 특성 만을 더 갖는 것이지요. 화물차의 경우에는 사람이 아닌 물건을 싣는다는 특성을 더 갖게 됩니다. 이때 자동차는 보편적인 걱이되고, 승용차나 승합차, 화물차는 특수한 것이 됩니다. 계층성이란 이와 같이 보편적인 것을 사위에 두고 특수한 것을 하위에 두는 것을 말합니다. 다시 말해서 동급이나 순서에 따라 계층적인 구조로 조각들을 배열하는 것을 말합니다.이때 자동차는 부모 클래스(parent class)로 특수한 개념인 승용차나 승합차,화물차는 자식클래스(child class)로 표현됩니다.

출처 : 객체지향이야기-전병선 책참조

 

 

▲ Method Overriding : 슈퍼클래스로 부터 메소드를 상속 받았지만 전체적으로 봤을때

 같은 기능이지만 세부적인 기능이 틀려서 상속 받은 메소드를 무시하고 새로 구현
 -규칙 :
   - returntype, 메소드명, 아규먼트 타입 or 개수가 반드시 일치해야 한다.
   - modifier는 같거다 크게(public)으로 한다.
   

▲ Method Overloading

- 식별자 규칙에 의해 클래스 이름, 메소드 이름, 변수 이름은 중복 할 수 없다

- 메소드의 argument type 또는 argument의 개수가 틀리다면 메소드의 이름 중복을 허용

- 사용자 입장에서 같은 기능을 쉽게 사용할 수 있도록....

=> 같은 기능의 메소드이지만 아규먼트의 타입 또는 개수가 틀려서 여러개를
    구현해야 할때 메소드의 이름을 모두 틀리게 주면 메소드를 사용하는 사용자가
    불편하므로 메소드의 이름 중복을 허용하고 아규먼트로 메소드를 구분.

ex)

 

 

NonOverLoading

 

OverLoading

class Math{

  public int plusInt(int a, int b)

    {return a+b;}

  public double plusDouble(double a, double b)

    {return a+b;}

  public String plusString(String a, String b)

    {return a+b;}

  public char plusChar(char a, char b)

    {return a+b;}

}

public static void main(String[] args){

  Math m = new Math();

  m.plusInt(10,20);

  m.plusString("a","b");

}

class Math{

  public int plus(int a, int b)

    {return a+b;}

   public double plus(double a, double b)

    {return a+b;}

  public String plus(String a, String b)

    {return a+b;}

  public char plus(char a, char b)

    {return a+b;}

}

public static void main(String[] args){

  Math m = new Math();

  m.plus(10,20);

  m.plus("a","b");

}

 

 

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

'공부하자' 카테고리의 다른 글

실습 4 : WebtoB와 JEUS연동  (0) 2008.07.07
이력서 작성시 가족관계의 정확한 명칭  (0) 2007.10.25