본문 바로가기
자격증/정보처리기사

Java 언어

by 두두리안 2022. 7. 10.
728x90

목차

1. 클래스와 객체
2. 상속(Inheritance)
3. 예외처리

1. 클래스와 객체

1-1. Java에서 클래스

class Circle{...}

public class HelloWorld{
    public static void main(String[] args){...}
}
* 자바는 모든 코드를 클래스 단위로 프로그래밍 한다
* main 메소드를 포함하는 클래스를 가장 먼저 실행
* 클래스에 포함되는 요소들을 멤버(member)라고 지칭
* 클래스는 틀을 제공할 뿐 데이터는 객체를 통해 확보

1-2. 클래스 구성

class Circle{
    double pi = 3.141592;
    double radius;

    void volume(){
        System.out.println(radius * radius * pi);
    }
}
1. 멤버 변수
    * 객체가 가지는 모든 상태, 수치, 성질에 대한 값을 의미
    * C언어에서 구조체와 유사한 성격을 가진다
    * 외부 요청이 필요한 메소드는 접근이 가능하도록 설정

1-3. 접근제어자(제한자)

class Circle{
    private double pi = 3.141592;
    private double radius;

    void volume(){
        System.out.println(radius * radius * pi);
    }

    public void set_radius(double r){
        radius = r;
    }
}
1. 접근제어자의 정의
    * 클래스 내 멤버들의 접근수준을 결정하는 토큰
    * 프로그램, 패키지, 하위 클래스, 자신의 클래스 순서로 접근수준을 결정
2. 접근제어자 종류
    * public: 프로그램 내 모든 객체에서 접근이 가능
    * default: 같은 패키지 내에서만 접근이 가능
    * protected: 자신과 하위 클래스에서만 접근이 가능
    * private: 자신의 클래스에서만 접근이 가능

1-4. 생성자(Constructor) 메소드

class Circle{
    private double pi = 3.141592;
    private double radius;

    Circle(double radius){
        this.radius = radius;
        System.out.println("객체가 생성 되었습니다.");
    }

    Circle(){
        this.radius = 3.0;
        System.out.println("객체가 생성 되었습니다.");
    }
}

public class HelloWorld{
    public static void main(String[] args){
        Circle c1 = new Circle(5.0);
        Circle c2 = new Circle();
    }
}
1. 생성자 메소드의 정의
    * 클래스 내부에 존재하며 객체가 생성될때 자동으로 실행되는 메소드
    * 객체가 생성될때 외에는 별도로 실행할수 없다
    * 생성자 메소드가 정의되어 있지 않으면 자바에서 자동 생성해 준다
2. this
    * 클래스 자신에 포함된 멤버변수에 접근하기 위한 토큰
3. 오버로딩
    * 하나의 클래스에 동일한 이름을 가진 여러 메소드를 사용하는 기술
    * 메소드의 인수유형과 개수의 차이로 각 메소드를 구별하여 호출

1-5. 객체 생성

class Circle{
    private double pi = 3.141592;
    private double radius;

    private static int cnt = 0;

    Circle(double radius){
        this.radius = radius;
        this.cnt++;
        System.out.println(this.cnt + "번 객체 생성");
    }

    void created_cnt(){
        System.out.println("총" + this.cnt + "번 객체 생성");
    }
}

public class HelloWorld{
    public static void main(String[] args){
        Circle c1 = new Circle(5.0);
        Circle c2 = new Circle(4.0);
        Circle c3 = new Circle(3.0);

        c1.created_cnt();
    }
}
1. 인스턴스 생성
    * 새로운 객체를 생성하여 적절한 타입의 변수에 할당하는 작업
    * new 키워드를 이용하여 인스턴스를 생성하고 동시에 생성자가 호출된다
    * 일반적으로 인스턴스의 타입과 객체 변수의 타입이 동일
2. 객체의 멤버 접근
    * 객체의 멤버에 직접 접근하기 위해서는 객체변수와 점(.)을 이용한다
    * 접근 제어자에 따라 직접접근이 어려울수 있다

2. 상속(Inheritance)

2-1. 상위 클래스

* 상위 클래스는 대부분의 속성을 하위 클래스에게 상속
* 여러 하위 클래스가 사용할 공통된 속성을 구현
* 상위 클래스 단독으로 인스턴스를 생성

2-2. 하위 클래스

* 상속받은 상위클래스의 대부분의 속성을 포함하여 인스턴스를 생성
* extends 키워드를 사용하여 상속받을 상위클래스를 지정
* 상위 클래스의 메소드를 재사용, 재정의하여 사용

2-3. 오버라이딩

class Espresso{
    int espresso = 20;

    void recipe(){
        System.out.println("에스프레소" + espresso + "ml");
    }

}

class Americano extends Espresso{
    int water = 80;

    void recipe(){
        System.out.println("에스프레소" + espresso + "ml + 물" water + "ml");
    }
}

public class HelloWorld{
    public static void main(String[] args){
        Espresso e1 = new Espresso();
        e1.recipe();

        Americano a1 = new Americano();
        a1.recipe();
    }
}
* 상위 클래스의 메소드를 재정의하여 사용하는 기술
* 상위 클래스와 동일한 메소드명과 매게변수를 지정하여 사용

2-4. 추상 클래스(Abstract Class)

abstract class Shape{
    abstract void draw();
}

class Circle extends Shape{
    void draw(){
        System.out.println("원을 그립니다");
    }
}

class Rectangle extends Shape{
    void draw(){
        System.out.println("사각형을 그립니다");
    }
}

public class HelloWorld{
    public static void main(String[] args){
        Circle c1 = new Circle();
        Rectangle r1 = new Reactangle();

        c1.draw();
        r1.draw();
    }
}
1. 추상클래스 개념
    * 클래스의 체계적인 설계를 위해 사용하는 클래스
    * 선언부만 있고 구현부가 없는 추상메소드를 하나라도 포함하면 추상클래스
    * 반드시 하위 클래스에서 상속하여 추상메소드를 오버라이딩해야 인스턴스 생성이 가능
    * 상속된 클래스에서도 구현되지 않은 추상메소드가 있다면 그 역시 추상클래스이므로 인스턴스 생성이 불가능
2. 추상 클래스의 구현
    * abstract 키워드를 사용하여 클래스와 메소드를 구현
    * 메소드의 구현분(중괄호)를 생략하여 표현
    * 추상클래스를 상속받은 후, 해당 메소드를 오버라이딩 한다

2-5. 인터페이스


interface Coffee {abstract void drink_coffee();}
interface Cookie {abstract void eat_cookie();}

class Cafe implements Coffee, Cookie{

    public void drink_coffee(){
         System.out.println("커피를 마신다");
    }

    public void eat_cookie(){
         System.out.println("쿠키를 먹는다");
    }
}

public class HelloWorld{
    public static void main(String[] args){
        Circle c1 = new Circle();
        Rectangle r1 = new Reactangle();

        c1.draw();
        r1.draw();
    }
}
1. 다중상속의 문제점
    * 둘 이상의 상위클래스를 지속 받는것을 다중상속이라고 한다
    * 상위 클래스 A, B가 같은 클래스 C를 상속받는 경우와 같이 상속관계가 복잡해지면 알수없는 부작용 발생확률 높아짐
2. 인터페이스 특징
    * 인터페이스는 모든 메소드가 추상 메소드로 정의되어 있는 추상클래스를 의미
    * 상속을 받지 않기 때문에 다중 상속의 부정적 영향을 전혀 받지 않고 다중 상속의 장점을 활용할수 있다
3. 인터페이스의 구현
    * class 대신 interface 키워드를 사용하여 구현하고, implements 키워드를 사용하여 상속
    * 확장된 클래스의 인스턴스를 상위 인터페이스 타입의 객체 변수에 할당하여 기능을 변경하거나 제한을 둔다

3. 예외처리

3-1. 예외 처리의 개념

* 프로그램 실행 도중 문제(예외)가 발생하면 프로그램이 멈추거나 종료
* 예외처리는 예외를 해결(처리)하는 코드를 구현하는 것
* 예외를 식별할 영역을 별도로 지정하여 예외가 자주 발생하는 코드를 보완

3-2. try-catch

* try 블록으로 감싼 코드에서 예외가 발생하면 catch 블록의 코드가 실행
* try 블록에서 발생한 예외로 인한 프로그램의 강제 종료를 막을수 있다

3-2. finally


public class HelloWorld{
    public static void main(String[] args){
        try{
            // 예외 감지
        }catch(){
            // 예외감지 실행
        }finally{
            // 무조건 실행
        }
    }
}
* 생략이 가능한 부분으로 예외 여부와 상관없이 항상 실행하는 블록

참고자료 : 이기적 환상콤비 정보처리기사

728x90

'자격증 > 정보처리기사' 카테고리의 다른 글

운영체제  (0) 2022.07.11
Python 언어  (0) 2022.07.11
객체지향 개발 절차  (0) 2022.07.10
객체지향 기술  (0) 2022.07.07
C언어 자료구조와 포인터  (0) 2022.07.07