본문 바로가기
정보처리기사

[정처기] 비개발자 JAVA 기초 - 6과목 프로그래밍 언어

by 공불러 2024. 4. 13.
728x90
반응형

JAVA 기초 - 6과목 프로그래밍 언어

지난 시간에는 C언어의 기초에 대해 알아봤습니다. 기초는 시험을 풀기 위한 기초적인 지식일뿐 실제 정보처리기사 실기 난이도는 이보다 많이 높으므로 기출문제 등을 다양하게 풀어봐야합니다.

암기식으로 하면 낭패를 볼 수 있으니, 이해를 중심으로 해야합니다.

 

이번 시간은 자바 기초에 대한 설명입니다. 생성자, 오버로딩, 오버라이딩은 헷갈릴 수 있으니 꼭 챙겨가셔야 연습 문제들에서 발휘될 수 있습니다.

목차

    JAVA란?

    자바(Java)는 컴퓨터 프로그래밍 언어 중 하나입니다. 자바는 소프트웨어 개발에 널리 사용되며, 다양한 종류의 애플리케이션 개발에 적합합니다. 자바는 우리가 사용하는 많은 디바이스와 시스템에서 실행될 수 있는 플랫폼 독립적인 언어입니다. 이것은 즉, 운영 체제(OS)나 하드웨어에 관계없이 프로그램을 실행할 수 있다는 것을 의미합니다.

     

    자바 언어로 작성된 프로그램은 일반적으로 "자바 가상 머신(Java Virtual Machine, JVM)"에서 실행됩니다. 이것은 자바 프로그램을 특정 운영 체제에 종속되지 않고 실행할 수 있도록 합니다.

     

    자바는 다양한 용도로 사용됩니다. 대규모 웹 애플리케이션부터 모바일 앱, 게임, 임베디드 시스템까지 다양한 분야에서 활용됩니다. 자바의 강력한 커뮤니티와 다양한 라이브러리 및 프레임워크는 개발자들이 프로그램을 빠르게 개발하고 유지 보수할 수 있도록 도와줍니다.

     

    JAVA 특징

    1. 객체 지향 언어(Object-Oriented)
      • 자바는 객체 지향 프로그래밍(OOP) 언어로 개발되었습니다.
      • 객체 지향 프로그래밍의 기본 원칙인 상속, 캡슐화, 다형성을 지원합니다.
      • 코드를 재사용하고 유지 보수하기 쉽게 만듭니다.
    2. 플랫폼 독립성(Platform-Independent)
      • 자바는 자바 가상 머신(Java Virtual Machine, JVM)에서 실행됩니다.
      • 이는 자바 프로그램이 특정 운영 체제에 종속되지 않고 여러 플랫폼에서 실행될 수 있음을 의미합니다.
      • "한 번 작성, 어디서나 실행"의 개념을 실현합니다.
    3. 강력한 커뮤니티와 생태계
      • 자바는 매우 강력한 커뮤니티와 다양한 개발자들이 사용하는 풍부한 생태계를 가지고 있습니다.
      • 다양한 라이브러리와 프레임워크들이 있어 개발자들이 효율적으로 프로그램을 개발할 수 있습니다.
    4. 멀티스레딩 지원(Multi-Threading Support)
      • 자바는 멀티스레드 프로그래밍을 지원합니다.
      • 멀티스레드를 사용하여 동시에 여러 작업을 수행할 수 있습니다.
      • 이는 프로그램의 성능을 향상시키고 효율적인 프로그램을 개발할 수 있도록 도와줍니다.
    5. 보안(Seccurity):
      • 자바는 보안을 강화하기 위해 설계되었습니다.
      • JVM에서 실행되는 자바 애플리케이션은 실행 중에 다른 프로그램이나 시스템에 영향을 주지 않도록 격리됩니다.
      • 다양한 보안 기능

    JAVA 기본 구성

    항목 설명
    클래스(Class) - 데이터와 해당 데이터를 처리하는 메서드를 포함하는 사용자 정의 데이터 유형.
    - 객체 생성을 위한 설계도 역할 수행.
    멤버 변수(Member Variables) - 클래스 내에서 데이터를 저장하는 변수.
    - 각 객체마다 개별적으로 값을 가질 수 있으며, 클래스의 상태를 나타냄.
    메서드(Methods) - 클래스 내에서 특정 작업을 수행하는 함수.
    - 데이터를 처리하거나 특정 작업을 실행하며, 객체의 상태를 변경하거나 정보를 반환함.

     

    접근지정자 설명

    1. public
      • public 접근 지정자는 해당 멤버가 어떤 클래스든 접근 가능하도록 합니다.
      • 다른 패키지에서도 접근 가능합니다.
      • 예시: public class MyClass { ... }
    2. protected
      • protected 접근 지정자는 같은 패키지 내의 클래스와 해당 클래스의 하위 클래스(subclass)에서만 접근 가능하도록 합니다.
      • 다른 패키지의 클래스에서는 접근할 수 없습니다.
      • 예시: protected int myVariable;
    3. default (package-private)
      • 접근 지정자를 명시하지 않은 경우 기본적으로 default 접근 지정자가 적용됩니다.
      • default 접근 지정자는 같은 패키지 내의 클래스에서만 접근 가능하도록 합니다.
      • 다른 패키지의 클래스에서는 접근할 수 없습니다.
      • 예시: int myVariable;
    4. private
      • private 접근 지정자는 해당 멤버가 선언된 클래스 내부에서만 접근 가능하도록 합니다.
      • 다른 클래스에서는 접근할 수 없습니다.
      • 예시: private int myVariable;

    객체 정의와 생성

    // 클래스 정의
    public class Person {
        // 멤버 변수 정의
        String name;
        int age;
    
        // 생성자 정의
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        // 메서드 정의
        public void displayInfo() {
            System.out.println("Name: " + name);
            System.out.println("Age: " + age);
        }
    }
    
    // 객체 생성 및 사용
    public class Main {
        public static void main(String[] args) {
            // Person 클래스의 객체 생성
            Person person1 = new Person("John", 30);
            Person person2 = new Person("Jane", 25);
    
            // 객체의 메서드 호출
            person1.displayInfo();
            person2.displayInfo();
        }
    }
    1. 객체 정의(Object Definition)
      • 객체는 클래스(Class)에 의해 정의됩니다. 클래스는 데이터와 해당 데이터를 처리하는 메서드(함수)를 포함하는 사용자 정의 데이터 유형입니다.
      • 객체는 클래스의 인스턴스(instance)입니다. 즉, 클래스의 설계도를 기반으로 만들어진 실제 데이터입니다.
      • 객체는 상태(state)와 행동(behavior)을 가지고 있습니다. 상태는 객체가 가지고 있는 데이터를 나타내고, 행동은 객체가 수행할 수 있는 작업을 의미합니다.
    2. 객체 생성(Object Creation)
      • 객체를 생성하기 위해서는 클래스의 인스턴스를 생성해야 합니다.
      • 객체를 생성하기 위해서는 new 키워드를 사용하여 클래스의 생성자(Constructor)를 호출해야 합니다.
      • 생성자는 객체의 초기화를 담당하며, 객체가 생성될 때 호출됩니다.
      • 생성된 객체는 변수에 할당하거나 다른 객체와의 상호 작용을 통해 사용될 수 있습니다.

    객체 지향 특징

    특징 설명
    생성자(Constructor) - 객체가 생성될 때 호출되는 특별한 종류의 메서드.
    - 객체를 초기화하고 필요한 초기 설정을 수행함
    - 클래스 이름과 동일한 이름을 가짐.
    - 명시적으로 선언되지 않으면 기본 생성자가 자동으로 생성됨.
    예외 처리(Exception Handling) - 프로그램 실행 중에 발생할 수 있는 예기치 않은 상황에 대비하여 처리하는 기능.
    - 예외 상황을 감지하고, 적절한 처리를 수행하여 프로그램의 비정상 종료를 방지함
    - try-catch-finally 블록을 사용하여 예외 처리를 구현함.
    상속(Inheritance) - 하나의 클래스가 다른 클래스의 특성과 기능을 취득할 수 있는 기능
    - 기존 클래스(부모 클래스 또는 상위 클래스)의 모든 기능을 새로운 클래스(자식 클래스 또는 하위 클래스)가 재사용할 수 있음.
    - 코드의 재사용성을 높임.
    - 클래스 간의 계층 구조를 형성하여 유지보수성을 개선함.
    메서드 오버라이딩(Method Overriding) - 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 기능.
    - 부모 클래스의 메서드와 동일한 시그니처를 가져야 함.
    - 자식 클래스에서 부모 클래스의 메서드를 새로 구현하여 특정 상황에 맞게 동작을 변경할 수 있음.
    메서드 오버로딩(Method Overloading) - 같은 이름의 메서드를 여러 개 정의하는 기능.
    - 메서드의 시그니처(매개변수의 타입, 개수, 순서)가 서로 다르도록 정의되어야 함.
    같은 이름의 메서드를 여러 버전으로 제공하여 다양한 형태의 입력을 처리할 수 있음.

     

    각 개념 예시

    1.생성자(Constructor)

    생성자는 클래스의 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 객체의 초기화 작업을 수행합니다.

    class Car {
    private:
        int speed;
        string color;
    
    public:
        Car(int s, string c) {
            speed = s;
            color = c;
        }
    };


    위의 예시에서 Car 클래스의 생성자는 speed와 color 변수를 초기화합니다.

    2.예외 처리(Exception Handling)

    예외 처리는 프로그램 실행 중에 발생할 수 있는 예외 상황을 처리하는 방법입니다. 예외가 발생하면 해당 예외를 처리하는 코드를 실행하여 프로그램의 비정상적인 종료를 방지합니다.

    try, catch,finally로 이루어집니다.

    try {
        // 예외가 발생할 가능성이 있는 코드
    } catch (Exception e) {
        // 예외 처리 코드
    } finally {
        // finally 블록
    }


    위의 예시에서 0으로 나누는 예외가 발생하면 catch 블록이 실행되어 예외 메시지를 출력합니다.

     

    3.상속(Inheritance)

    상속은 클래스 간의 관계를 나타내는 개념입니다. 상위 클래스(부모 클래스)의 속성과 메서드를 하위 클래스(자식 클래스)가 물려받아 사용할 수 있습니다.

    class Animal {
    public:
        void eat() {
            cout << "동물이 먹이를 먹습니다." << endl;
        }
    };
    
    class Dog : public Animal {
    public:
        void bark() {
            cout << "개가 짖습니다." << endl;
        }
    };


    위의 예시에서 Dog 클래스는 Animal 클래스를 상속받습니다. Dog 클래스는 Animal 클래스의 eat 메서드를 사용할 수 있으며, bark 메서드를 추가로 정의합니다.

     

    4.메서드 오버라이딩(Method Overriding) - 다형성

    메서드 오버라이딩은 상속받은 메서드를 하위 클래스에서 재정의하는 것입니다.

    재정의된 메서드는 상위 클래스의 메서드와 동일한 이름과 매개변수를 가지지만, 다른 기능을 수행할 수 있습니다.

    자식이 가진 메서드만을 실행합니다. 부모와 자식이 동일한 명칭의 메서드가 있다면 꼭 확인해야합니다.

    정처기에서는 인자 수만이 아니라 변수타입 별로도 구분하게 되니, 주의하셔야합니다.

    class Shape {
    public:
        virtual void draw() {
            cout << "Shape를 그립니다." << endl;
        }
    };
    
    class Circle : public Shape {
    public:
        void draw() {
            cout << "Circle를 그립니다." << endl;
        }
    };


    위의 예시에서 Circle 클래스는 Shape 클래스를 상속받습니다. Circle 클래스는 draw 메서드를 오버라이딩하여 Circle를 그리는 기능을 수행합니다.

     

    5.메서드 오버로딩(Method Overloading) - 다형성

    메서드 오버로딩은 같은 클래스 내에서 동일한 이름의 메서드를 재정의하는 것입니다.

    메서드의 매개변수의 개수와 형태가 다릅니다.

    class Calculator {
    public:
        int add(int a, int b) {
            return a + b;
        }
        double add(double a, double b) {
            return a + b;
        }
    };


    위의 예시에서 Calculator 클래스는 add 메서드를 오버로딩합니다. 첫 번째 add 메서드는 정수형 매개변수를 받아 더하고, 두 번째 add 메서드는 실수형 매개변수를 받아 더합니다.

    추상클래스와 인터페이스

    추상클래스(Abstract Class) - extends

    • 추상클래스는 하나 이상의 추상 메서드(구현이 없는 메서드)를 포함하는 클래스입니다.
    • 추상 메서드는 메서드의 시그니처만 정의되어 있고, 실제 구현은 하위 클래스에서 이루어집니다.
    • 객체를 직접 생성할 수 없으며, 추상클래스를 상속받은 하위 클래스에서 추상 메서드를 반드시 구현해야 합니다.
    • 일반 메서드와 멤버 변수도 포함할 수 있습니다.
    abstract class Animal {
        abstract void eat(); // 추상 메서드
    }
    
    class Dog extends Animal {
        void eat() {
            System.out.println("개가 먹이를 먹습니다.");
        }
    }

    위의 예시에서 Animal은 추상 클래스입니다. eat은 추상 메서드이므로 하위 클래스인 Dog에서 구현해야 합니다. Dog 클래스는 Animal 클래스를 상속받아 eat 메서드를 구현합니다.

    인터페이스(Interface) - impelents

    모든 메서드가 전부 추상화돠고 아무것도 구현되어 있으면 안됩니다.

    • 인터페이스는 추상 메서드와 상수만을 포함하는 특별한 종류의 클래스입니다.
    • 모든 메서드는 기본적으로 추상 메서드로 선언되며, 몸체(body)가 없습니다.
    • 여러 클래스가 동일한 동작을 구현하도록 강제하기 위해 사용됩니다.
    • 클래스는 여러 인터페이스를 구현할 수 있으며, 인터페이스를 상속받는 것은 implements 키워드를 사용합니다.
    interface Drawable {
        void draw(); // 추상 메서드
    }
    
    class Circle implements Drawable {
        void draw() {
            System.out.println("원을 그립니다.");
        }
    }

    위의 예시에서 Drawable은 인터페이스입니다. draw는 추상 메서드이므로 Circle 클래스에서 구현해야 합니다. Circle 클래스는 Drawable 인터페이스를 구현하여 draw 메서드를 구현합니다.

    JAVA 주요 용어

    • JVM(Java Virtual Machine): 자바 프로그램을 실행하기 위한 가상 머신으로, 특정 운영 체제에 종속되지 않고 실행할 수 있도록 합니다.
    • abstract: 추상 클래스를 선언할 때 사용하는 예약어입니다. 추상 클래스는 직접 객체를 생성할 수 없으며, 추상 메서드를 포함합니다.
    • class: 클래스를 선언할 때 사용하는 예약어입니다. 클래스는 객체를 생성하기 위한 틀입니다.
    • extends: 클래스가 다른 클래스를 상속받을 때 사용하는 예약어입니다. 상속받은 클래스는 상위 클래스의 속성과 메서드를 사용할 수 있습니다.
    • final: 변수나 메서드를 final로 선언하면, 해당 변수나 메서드는 수정할 수 없습니다. 클래스를 final로 선언하면, 해당 클래스는 상속할 수 없습니다.
    • interface: 인터페이스를 선언할 때 사용하는 예약어입니다. 인터페이스는 추상 메서드와 상수만을 포함하는 추상 클래스입니다.
    • implements: 클래스가 인터페이스를 구현할 때 사용하는 예약어입니다. 구현한 클래스는 인터페이스의 모든 추상 메서드를 구현해야 합니다.
    • native: native 메서드를 선언할 때 사용하는 예약어입니다. native 메서드는 자바가 아닌 다른 언어로 작성된 코드를 호출하는 메서드입니다.
    • private: 클래스의 private 변수나 메서드는 같은 클래스 내에서만 접근할 수 있습니다.
    • protected: 클래스의 protected 변수나 메서드는 같은 클래스, 하위 클래스, 그리고 같은 패키지 내의 다른 클래스에서 접근할 수 있습니다.
    • public: 클래스의 public 변수나 메서드는 모든 클래스에서 접근할 수 있습니다.
    • this: 같은 클래스의 다른 객체를 참조할 때 사용하는 예약어입니다. 주로 생성자에서 사용되며, 생성자의 매개변수와 같은 이름의 변수를 초기화할 때 사용됩니다.
    • throws: 메서드에서 발생할 수 있는 예외를 선언할 때 사용하는 예약어입니다. 예외를 선언하면, 해당 메서드를 호출하는 쪽에서 예외를 처리해야 합니다.
    • void: 반환값이 없는 메서드를 선언할 때 사용하는 예약어입니다.

    (추가) 혼동 사항 정리

    This를 쓸 때와 안쓸 때 차이

    아래 코드에서는 getName() 메서드에서는 this.name을 사용하여 현재 객체의 name 멤버 변수를 반환하고, getNameWithoutThis() 메서드에서는 name을 사용하여 매개변수의 값을 반환합니다. 이렇게 하면 메서드 내에서 현재 객체의 멤버 변수를 명시적으로 참조할 수 있습니다.

    public class Person {
        String name;
        int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        // this 키워드를 사용한 getName() 메서드
        public String getName() {
            return this.name; // 현재 객체의 name 멤버 변수 반환
        }
    
        // this 키워드를 사용하지 않은 getNameWithoutThis() 메서드
        public String getNameWithoutThis() {
            return name; // 매개변수 name 반환 (this 키워드 없음)
        }
    
        public static void main(String[] args) {
            Person person1 = new Person("John", 30);
    
            System.out.println(person1.getName());           // 출력: John
            System.out.println(person1.getNameWithoutThis()); // 출력: John
        }
    }
    728x90
    반응형

    댓글