카테고리 없음

객체지향 언어

SOME코딩 2023. 4. 23. 23:03

객체지향 언어

1. 캡슐화

2. 상속

3. 추상화

4. 다형성  *

 

<클래스와 객체>

클래스의 정의: 클래스란 객체를 정의해 놓은 것

클래스의 용도: 클래스는 객체를 생성하는데 사용

 

객체의 정의: 실제로 존재하는 것. 사물 또는 개념

객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름.

클래스 객체
제품 설계도 제품
TV 설계도 TV
붕어빵 기계 붕어빵

 

객체의 구성요소 - 속성과 기능

객체 = 속성(변수) + 기능(메서드)

TV

- 속성: 크기, 길이, 높이, 색상, 볼륨, 채널 등           -> 변수

- 기능: 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등           -> 메서드

 

class Tv {

  String color; // 색깔

  boolean power; //전원상태

  int channel; // 채널

 

  void power() {power = !power; }

  void channelUp() {channel++;}

  void channelDown() {channel--;}

}

 

객체와 인스턴스

객체: 모든 인스턴스를 대표하는 일반적 용어

인스턴스: 특정 클래스로부터 생성된 객체(예: Tv인스턴스)

 

클래스 -인스턴스화-> 인스턴스(객체)

 

하나의 소스파일에 여러 클래스 작성

Hello2.java

public class Hello2 {}

          class Hello3 {}

public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다.

 

Hello2.java

class Hello2 {}

class Hello3 {}

public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.

 

<잘못된 작성 예>

Hello2.java

public class Hello2 {}

public class Hello3 {}

하나의 소스파일에 둘 이상의 public class가 존재하면 안된다. 각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스를 public을 붙이지 않아야 한다.

 

main메서드를 가지고 있는 클래스와 소스파일의 이름이 일치해야 한다.

 

객체의 생성과 사용

1. 객체의 생성

클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언

변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t;

t = new Tv();

 

2. 객체의 사용(변수, 메서드 사용)

t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.

t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다.

 

Tv t1 = new Tv();

Tv t2 = new Tv();

t2 = t1; //t2의 참조주소값이 t1의 참조주소값과 같은 주소를 가리키게 됨

t1.channel = 7;

System.out.println("t1의 channel값은 "+t1.channel+"입니다.");  // 7

System.out.println("t2의 channel값은 "+t2.channel+"입니다.");  // 7

 

하나의 인스턴스를 여러 개의 참조변수가 가리키는 경우(가능)

여러 인스턴스를 하나의 참조변수가 가리키는 경우(불가능)

 

객체 배열

Tv[] tvArr = new Tv[3];

tvArr[0] = new Tv();

tvArr[1] = new Tv();

tvArr[2] = new Tv();

 

Tv[] tvArr = {new Tv(), new Tv(), new Tv()};

 

클래스 변수와 인스턴스 변수

class Card {

  //인스턴스 변수(개별 속성)

  String kind; //무늬

  int number; //숫자

 

  // 클래스 변수(공통 속성)

  static int width = 100; //폭

  static int height = 250; //높이

}

 

클래스 변수와 인스턴스 변수 사용

Card c = new Card();

c.kind = "HEART";

c.number = 5;

 

Card.width = 200;  

Card.height = 300;

 

기본형 매개변수

기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)

참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read&write)

 

참조형 매개변수

class Data2 { int x; }

 

class Ex6_7 {

  public static void main(String[] args) {

    Data2 d = new Data2();

    d.x = 10;

    System.out.println("main() : x = " + d.x);

 

    change(d);

    System.out.println("After change(d)");

    System.out.println("main() : x = " + d.x);

  }

  static void change(Data2 d) { // 참조형 매개변수

    d.x = 1000;

    System.out.println("change() : x = " + d.x);

  }

}

 

결과

main() : x = 10

change() : x = 1000

After change(d)

main() : x = 1000

 

static 메서드와 인스턴스 메서드

 

class MyMath2 {

  long a, b; // iv인스턴스 변수

 

  long add() { //인스턴스 메서드

    return a+b;

  }

 

  static long add(long a, long b) { // 클래스 메서드(static 메서드)

    return a+b;

  }

}

 

인스턴스 메서드

- 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출

- 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드

- 메서드 내에서 인스턴스 변수(iv) 사용가능

static 메서드(클래스 메서드): iv를 사용하지 않을 때 사용

- 객체생성 없이 '클래스이름.메서드이름()'으로 호출

- 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드

- 메서드 내에서 인스턴스 변수(iv) 사용불가

 

public static void main(String args[]) {

  System.out.println(MyMath2.add(200L, 100L); //클래스메서드 호출

  MyMath2 mm = new MyMath2(); //인스턴스 생성

  mm.a = 200L;

  mm.b = 100L;

  System.out.println(mm.add()); // 인스턴스 메서드 호출

}

 

오버로딩(overloading)

: 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것

 

오버로딩이 성립하기 위한 조건(3가지)

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3. 반환 타입은 영향없다.

 

생성자(constructor)

- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'

 

Time t = new Time(12, 34, 56);

- 이름이 클래스 이름과 같아야 한다.

- 리턴값이 없다.(void 안붙임)

- 모든 클래스는 반드시 생성자를 가져야 한다.

 

class Card {

  Card() { // 매개변수 없는 생성자

    // 인스턴스 초기화 작업

  }

  Card(String kind, int number) { // 매개변수 있는 생성자

    // 인스턴스 초기화 작업

  }

}

 

기본 생성자(default constructor)

- 매개변수가 없는 생성자

- 생성자가 하나도 없을 때만, 컴파일러가 자동 추가

클래스이름() {} 

 

생성자 this()

- 생성자에서 다른 생성자 호출할 때 사용

- 다른 생성자 호출시 첫 줄에서만 사용가능

 

class Car2 {

  String color;

  String gearType;

  int door;

 

  Car2() {

    this("white", "auto", 4);

  }

  Car2(String color) {

    this(color, "auto", 4);

  }

  Car2(String color, String gearType, int door) {

    this.color = color;

    this.gearType = gearType;

    this.door = door;

  }

}

 

참조변수 this

- 인스턴스 자신을 가리키는 참조변수

- 인스턴스 메서드(생성자 포함)에서 사용가능

- 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

 

Car(String color, String grearType, int door) {

  // this.color는 iv, color는 lv

  this.color = color;

  this.gearType = gearType;

  this.door = door;

}

 

변수의 초기화

- 지역변수(lv)는 수동 초기화 해야함(사용전 꼭)

- 멤버변수(iv, cv)는 자동 초기화 된다.

 

초기화 블럭

- 인스턴스 초기화 블럭: {}

- 클래스 초기화 블럭: static {} 

 

클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 단 한번

인스턴스 변수 초기화 시점: 인스턴스가 생성될 때 마다