정보처리기사

[JAVA] 자바의 객체 지향 특징

김꼬알 2023. 4. 17. 20:22

JAVA 언어

JAVA의 역사

  • 자바는 1980년대 초, 미국 Sun 사의  Jammes Gosling이 전자제품에 이용할 목적으로 개발
  • 인터넷이 확상되면서 90년대부터 관심을 받기 시작함

 

JAVA의 특징

  • 이식성이 높은 언어
  • 객체 지향 언어
  • 메모리를 자동으로 관리
  • 다양한 어플리케이션 개발
  • 멀티쓰레드 구현
  • 동적로딩 지원
  • 오픈 소스 라이브러리가 풍부

 

JAVA의 기본 구성

클래스(Class)

  • 객체가 가지고 있는 속성과 연산의 구조를 정의한다.
  • 속성은 멤버변수로, 연산은 메서드로 정의한다.

 

멤버 변수(Member Variable)

  • 객체의 속성을 정의한다.
  • 해당 객체가 가지고 있는 고유한 값이다.

 

메서드(Method)

  • 특정 작업을 수행하기 위한 명령문의 집합
  • 멤버변수의 값이나 상태를 변경할 수 있는 명령의 집합

 

접근 지정자

  • 클래스의 멤버 변수와 메서드를 외부에서 접근할 수 있는 범위를 지정한다.
  • 종류

 

인스턴스

  • 클래스를 통해서 실제로 구현된 구체적인 실체
  • 실제로 메모리에 할당된 상태

 

객체 정의와 생성

  • 현실 세계를 객체로 표현한다.
public class Person {
    String name = "홍길동";
    int age = 40;
    
    public void setName(String n)
    {
        name = n;
    }
    public void setAge(int i)
    {
        age = i;
    }
    
    public static void main(String[] args){
        Person p1 = new Person();    // p1 이라는 인스턴스 생성
        
        p1.set_name("홍길동");
        p1.set_age(40);
    }
}

 

 

객체지향 특징

생성자

  • 인스턴스가 만들어질 때, 초기값 등을 지정하는 역할을 한다.
  • 자바에서 생성자는 해당 클래스의 이름과 같아야 한다,
  • 생성자는 인자를 다르게 하여 여러 개를 가질 수 있다.
public class Person{
    String name;
    int age;
    
    public Person(){    // 인자가 없는 생성자
        this.name = "사람";
        this.age = 1;
    }
    public Person(String name, int age){    // 인자가 있는 생성자
        this.name = name;
        this.age = age;
    }

    public void toPrint(){
        System.out.println(this.name + "님의 나이는" + this.age + "살 입니다.");
    }
    
    public static void main(String[] args){
        Person p1 = new Person();    // 값을 넣지 않으면 인자가 없는 생성자가 호출됨
        p1.toPrint();    // 사람님의 나이는 1살입니다.
        
        Person p2 = new Person("이흥직", 40);    // 인자가 있는 생성자가 호출됨
        p2.toPrint();    // 이흥직님의 나이는 40살입니다.
    }
}

 

예외처리(Exception Handling)

  • 프로그램 실행 중에 발생하는 예외를 처리해주는 방법
  • 예외 상황이 발생했을 때 프로그램이 자연스럽게 종료될 수 있도록 처리한다.
public static void main(String[] args){
    try{
        코드 실행
    }
    catch(ArithmeticException e){
        산술 계산 오류 발생시 실행
    }
    catch(Exception e){
        모든 오류 발생시 실행
    }
    finally{
        모든 오류 처리가 종료된 후 실행    // finally 구문은 오류가 발생하지 않아도 실행함
    }
}

 

상속(Inheritance)

  • 부모 클래스의 멤버를 자식 클래스에서 그대로 쓸 수 있다.
  • 클래스를 재사용할 수 있기 때문에 효율적이고 개발 시간을 단축시킨다.
  • 부모의 private 한 멤버는 상속 받을 수 없다.
  • extends 라는 키워드를 사용한다.
class Parent{
    String name;
    int age;
    public void set_name(String param_n){
        name = param_n;
    }
    public void set_age(int param_i){
        age = param_i;
    }
}

class Child extends Parent{
    int height;
    public void set_height(int param_h){
        height = param_h;
    }
    
    public static void main(String[] args){
        Child c = new Child();
        c.set_name("홍길동");
        c.set_age(40);
        c.set_height(170);
        
        System.out.print(c.name);    // 홍길동
        System.out.print(c.age);    // 40
        System.out.print(c.height);    // 170
    }
}

 

메서드 오버라이딩(Method Overriding)

  • 상속 관계에서 부모 클래스에서 정의된 메서드를 다시 재정의한다.
  • 추상 클래스나 인터페이스를 상속 받을 때 사용되는 개념이다.
  • 부모 메서드의 이름, 리턴 타입, 매개변수의 개수와 유형이 완전히 동일해야 한다.
class Parent{
    public void set_name(String param_n){
        System.out.println("부모의 이름 변경");
    }
    public void set_age(int param_i){
        System.out.println("부모의 나이 변경");
    }
}

class Child extends Parent{
    public void set_name(String param_n){
        System.out.println("자식의 이름 변경");
    }
    public void set_height(int param_h){
        System.out.println("자식의 키 변경");
    }
}

    public static void main(String[] args){
        Child c = new Child();
        c.set_name("홍길동");    // 자식의 이름 변경
        c.set_age(40);    // 부모의 나이 변경
        c.set_height(170);    // 자식의 키 변경
    }
}

 

메서드 오버로딩(Method Overloading)

  • 같은 이름의 메서드를 인자만 다르게 하여 중복 정의하는 것이다.
  • 메서드의 이름이 같아야 하고, 인자의 개수나 타입이 달라야 한다.
class Person{
    String name;
    int age;
    int height
    public void set_data(String p_name){
        name = p_name;
    }
    public void set_data(String p_name, int p_age){
        name = p_name;
        age = p_age;
    }
    
    public static void main(String[] args){
        Person p1 = new Person();
        p1.set_data("홍길동");
        
        Person p1 = new Person();
        p2.set_data("홍길동", 40);
    }
}

 

 

추상 클래스와 인터페이스

추상 클래스(abstract class)

  • 반드시 오버라이딩해서 사용할 미완성의 메서드를 하나 이상 가진 미완성 클래스
  • 추상 클래스를 상속받은 자식 클래스에서 추상 메서드를 구현해서 사용한다.
  • 추상 클래스는 객체를 생성할 수 없다.
abstract class Remote{
    public int volume = 10;
    public int channel = 1;
    
    public void volume_up(){
        this.volume++;
    }
    abstract void channel_change(int i);
}
class TV_Remote extends Remote{
    void channel_change(int i){
        channel = i;
    }
    
    public static void main(String[] args){
        TV_Remote tv = new TV_Remote();
        tv.volume_up();
        tv.volume_up();
        System.out.print("볼륨:" + tv.volume);    // 위에서 볼륨을 2 올렸으므로 볼륨:12 이 출력됨
        tv.channel_change(5);
        System.out.print("채널:" + tv.channel);    // 채널:5 출력됨
    }
}

 

인터페이스(interface)

  • 추상 클래스의 극단으로, 모든 메서드가 추상적인 형태이다.
interface Remote{
    public void volume_up();
    public void channel_change(int i);
}
class TV_Remote implements Remote{
    public int volume = 10;
    public int channel = 1;
    public void channel_change(int i){
        this.channel = i;
    }
    public void volume_up(){
        this.volume++;
    }
    
    public static void main(String[] args){
        TV_Remote tv = new TV_Remote();
        tv.volume_up();
        tv.volume_up();
        System.out.println("볼륨:" + tv.volume);
        tv.channel_change(5);
        System.out.println("채널:" + tv.channel);
    }
}