ABOUT ME

Today
Yesterday
Total
  • 객체지향 언어
    카테고리 없음 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 {} 

     

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

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

     

Designed by Tistory.