자바는 객체지향언어

객체지향 언어

  • 80년 초 소프트웨어의 위기 - 빠른 변화를 못쫓아감
  • 해결책으로 객체지향 언어를 도입(절차적 -> 객체지향)
  • 1996년 Java가 나옴
  • 코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거
  • 객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙) // 외우세요

OOP(Object-oriented prgramming) 객체지향언어의 4가지 핵심

1. 캡슐화

2. 상속

3. 추상화

4. 다형성

 

 

클래스와 객체

  • 클래스의 정의: 객체를 정의해 놓은 것 ->제품 설계도
  • 클래스의 용도: 객체를 생성하는데 사용
  • 객체의 정의 : 실제로 존재하는 것, 사물 또는 개념 ->제품
  • 객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름

 

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

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

 

객체와 인스턴스

  • 객체: 모든 인스턴스를 대표하는 일반적 용어
  • 인스턴스: 특정 클래스로부터 생성된 객체

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

 

객체와 인스턴스

 

클래스가 필요한 이유? 

-> 객체를 생성하기 위해

 

객체가 필요한 이유?

-> 객체를 사용하기 위해

 

객체를 사용한다는 것은?

-> 객체가 가진 속성과 기능을 사용하려고

 

 

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

  • public class 가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.
  • public class가 하나도 없는 경우, 소스파일의 이름은  상관 없음

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

객체의 생성과 사용

1. 객체의 생성

 

클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언 --> 리모콘 역할

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

Tv t;   //Tv 클래스 타입의 참조변수 t를 선언

t = new tv(); //Tv 인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

 

2. 객체의 사용

 

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

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

System.out.println("현재 채널은 " + t.channel + " 입니다.");

 

객체의 생성과 사용 - 예제

  • 참조변수가 없으면 객체는 사용 불가 -> Garbage Collector 가 제거해간다.
  • 하나의 인스턴스를 여러 개의 참조변수가 가르키는 경우 (가능)
  • 여러 인스턴스를 하나의 참조변수가 가르키는 경우 (불가능)

 

class Ex6_1 {
    public static void main(String args[]) {
        Tv t;                 // Tv인스턴스를 참조하기 위한 변수 t를 선언
        t = new Tv();         // Tv인스턴스를 생성한다.
        t.channel = 7;        // Tv인스턴스의 멤버 변수 channel의 값을 7로 한다.
        t.channelDown();      // Tv인스턴스 메서드 channelDown()을 호출한다.
        System.out.println("현재 채널은 " + t.channel + " 입니다..");
    }
}

class Tv {
    // Tv의 속성(멤버변수)
    String color;           // 생상
    boolean power;             // 전원상태(on/off)
    int channel;               // 채널

    // Tv의 기능(메서드)
    void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드
    void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드
    void channelDown() { --channel; }   // TV의 채널을 낮추는 기능을 하는 메서드
}

 

class Ex6_2 {
    public static void main(String args[]) {
        Tv t1 = new Tv();  // Tv t1; t1 = new Tv();를 한 문장으로 가능
        Tv t2 = new Tv();
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

        t1.channel = 7;    // channel 값을 7으로 한다.
        System.out.println("t1의 channel값은 7로 변경하였습니다.");
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    }
}

객체마다 별도의 저장공간을 가진다.

 

객체 배열

객체 배열 == 참조변수 배열

 

 

클래스의 정의

클래스 == 데이터 + 함수

 

1. 변수: 하나의 데이터를 저장할 수 있는 공간

2. 배열: 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간

3. 구조체: 서로 관련된 여러 데이터(종류 관계x)를 하나로 저장할 수 있는 공간

4. 클래스: 데이터와 함수의 결합(구조체 +함수)

 

사용자 정의 타입 - 원하는 타입을 직접 만들 수 있다.

 

 

선언 위치에 따른 변수의 종류

 

 

cv는 아무때나 사용가능

iv는 객체생성을 해야 사용 가능

lv는 변수 선언문이 수행되었을 때 사용 

 

 

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

공통 속성은 static 붙인다.

 

클래스 이름을 cv에 붙인다.

 

class Ex6_3 {
    public static void main(String args[]) {
        System.out.println("Card.width = " + Card.width);
        System.out.println("Card.height = " + Card.height);

        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;

        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;

        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
        System.out.println("c1은 width와 height를 각각 50, 80으로 변경합니다.");
        c1.width = 50;
        c1.height = 80;

        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
    }
}

class Card {
    String kind;
    int number;
    static int width = 100;
    static int height = 250;
}

 

메서드란?

1. 문장들을 묶어놓은 것

   - 작업 단위로 문장들을 묶어서 이름 붙인 것

 

2. 값(입력)을 받아서 처리하고 결과을 반환(출력)

 

매서드의 장점

- 코드의 중복을 줄일 수 있다.

- 코드의 관리가 쉽다.

- 재사용 가능

- 반복적으로 수행되는 여러문장을 메서드로 작성

 

메서드 = 선언부 + 구현부

 

반환타입 메서드이름 (타입변수명, 타입변수명, ...)

{

//메서드 호출시 수행될 코드

}

 

메서드

반환타입이 없을 땐 void라고 적는다.

 

메서드의 구현부

지역변수(lv): 메서드 내에 선언된 변수

 

 

메서드의 호출

메서드이름(값1, 값2, ...); // 메서드를 호출하는 방법

 

print99danAll(); // void print99danAll() 호출

int result = add(3,5); // int add(intx, int y)를 호출하고 결과를 result에 저장

 

class Ex6_4 {
    public static void main(String args[]) {
        MyMath mm = new MyMath();
        long result1 = mm.add(5L, 3L);
        long result2 = mm.subtract(5L, 3L);
        long result3 = mm.multiply(5L, 3L);
        double result4 = mm.divide(5L, 3L);

        System.out.println("add(5L, 3L) = " + result1);
        System.out.println("subtract(5L, 3L) = " + result2);
        System.out.println("multiply(5L, 3L) = " + result3);
        System.out.println("divide(5L, 3L) = " + result4);
    }
}

class MyMath {
    long add(long a, long b) {
        long result = a + b;
        return result;
        // return a + b;  //위의 두 줄을 이와 같이 한 줄로 간단히 할 수 있다.
    }
    long subtract(long a, long b) { return a - b; }
    long multiply(long a, long b) { return a * b; }
    double divide(double a, double b) {
        return a / b;
    }
}

 

 

 

 

메서드의 실행흐름

 

+ Recent posts