JAVA 기초 - 6과목 프로그래밍 언어
지난 시간에는 C언어의 기초에 대해 알아봤습니다. 기초는 시험을 풀기 위한 기초적인 지식일뿐 실제 정보처리기사 실기 난이도는 이보다 많이 높으므로 기출문제 등을 다양하게 풀어봐야합니다.
암기식으로 하면 낭패를 볼 수 있으니, 이해를 중심으로 해야합니다.
이번 시간은 자바 기초에 대한 설명입니다. 생성자, 오버로딩, 오버라이딩은 헷갈릴 수 있으니 꼭 챙겨가셔야 연습 문제들에서 발휘될 수 있습니다.
목차
JAVA란?
자바(Java)는 컴퓨터 프로그래밍 언어 중 하나입니다. 자바는 소프트웨어 개발에 널리 사용되며, 다양한 종류의 애플리케이션 개발에 적합합니다. 자바는 우리가 사용하는 많은 디바이스와 시스템에서 실행될 수 있는 플랫폼 독립적인 언어입니다. 이것은 즉, 운영 체제(OS)나 하드웨어에 관계없이 프로그램을 실행할 수 있다는 것을 의미합니다.
자바 언어로 작성된 프로그램은 일반적으로 "자바 가상 머신(Java Virtual Machine, JVM)"에서 실행됩니다. 이것은 자바 프로그램을 특정 운영 체제에 종속되지 않고 실행할 수 있도록 합니다.
자바는 다양한 용도로 사용됩니다. 대규모 웹 애플리케이션부터 모바일 앱, 게임, 임베디드 시스템까지 다양한 분야에서 활용됩니다. 자바의 강력한 커뮤니티와 다양한 라이브러리 및 프레임워크는 개발자들이 프로그램을 빠르게 개발하고 유지 보수할 수 있도록 도와줍니다.
JAVA 특징
- 객체 지향 언어(Object-Oriented)
- 자바는 객체 지향 프로그래밍(OOP) 언어로 개발되었습니다.
- 객체 지향 프로그래밍의 기본 원칙인 상속, 캡슐화, 다형성을 지원합니다.
- 코드를 재사용하고 유지 보수하기 쉽게 만듭니다.
- 플랫폼 독립성(Platform-Independent)
- 자바는 자바 가상 머신(Java Virtual Machine, JVM)에서 실행됩니다.
- 이는 자바 프로그램이 특정 운영 체제에 종속되지 않고 여러 플랫폼에서 실행될 수 있음을 의미합니다.
- "한 번 작성, 어디서나 실행"의 개념을 실현합니다.
- 강력한 커뮤니티와 생태계
- 자바는 매우 강력한 커뮤니티와 다양한 개발자들이 사용하는 풍부한 생태계를 가지고 있습니다.
- 다양한 라이브러리와 프레임워크들이 있어 개발자들이 효율적으로 프로그램을 개발할 수 있습니다.
- 멀티스레딩 지원(Multi-Threading Support)
- 자바는 멀티스레드 프로그래밍을 지원합니다.
- 멀티스레드를 사용하여 동시에 여러 작업을 수행할 수 있습니다.
- 이는 프로그램의 성능을 향상시키고 효율적인 프로그램을 개발할 수 있도록 도와줍니다.
- 보안(Seccurity):
- 자바는 보안을 강화하기 위해 설계되었습니다.
- JVM에서 실행되는 자바 애플리케이션은 실행 중에 다른 프로그램이나 시스템에 영향을 주지 않도록 격리됩니다.
- 다양한 보안 기능
JAVA 기본 구성
항목 | 설명 |
클래스(Class) | - 데이터와 해당 데이터를 처리하는 메서드를 포함하는 사용자 정의 데이터 유형. - 객체 생성을 위한 설계도 역할 수행. |
멤버 변수(Member Variables) | - 클래스 내에서 데이터를 저장하는 변수. - 각 객체마다 개별적으로 값을 가질 수 있으며, 클래스의 상태를 나타냄. |
메서드(Methods) | - 클래스 내에서 특정 작업을 수행하는 함수. - 데이터를 처리하거나 특정 작업을 실행하며, 객체의 상태를 변경하거나 정보를 반환함. |
접근지정자 설명
- public
- public 접근 지정자는 해당 멤버가 어떤 클래스든 접근 가능하도록 합니다.
- 다른 패키지에서도 접근 가능합니다.
- 예시: public class MyClass { ... }
- protected
- protected 접근 지정자는 같은 패키지 내의 클래스와 해당 클래스의 하위 클래스(subclass)에서만 접근 가능하도록 합니다.
- 다른 패키지의 클래스에서는 접근할 수 없습니다.
- 예시: protected int myVariable;
- default (package-private)
- 접근 지정자를 명시하지 않은 경우 기본적으로 default 접근 지정자가 적용됩니다.
- default 접근 지정자는 같은 패키지 내의 클래스에서만 접근 가능하도록 합니다.
- 다른 패키지의 클래스에서는 접근할 수 없습니다.
- 예시: int myVariable;
- 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();
}
}
- 객체 정의(Object Definition)
- 객체는 클래스(Class)에 의해 정의됩니다. 클래스는 데이터와 해당 데이터를 처리하는 메서드(함수)를 포함하는 사용자 정의 데이터 유형입니다.
- 객체는 클래스의 인스턴스(instance)입니다. 즉, 클래스의 설계도를 기반으로 만들어진 실제 데이터입니다.
- 객체는 상태(state)와 행동(behavior)을 가지고 있습니다. 상태는 객체가 가지고 있는 데이터를 나타내고, 행동은 객체가 수행할 수 있는 작업을 의미합니다.
- 객체 생성(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
}
}
'정보처리기사' 카테고리의 다른 글
[정처기] 비개발자 파이썬 기본기 - 정보처리기사 실기 문제 잡기 (2) | 2024.04.18 |
---|---|
[정처기] 비개발자 파이썬 기초 - 6과목 프로그래밍 언어 (0) | 2024.04.14 |
[정처기] 비개발자 C언어 기초 - 6과목 프로그래밍 언어 (0) | 2024.04.13 |
[정보처리기사] 5. 보안 공격 기법 총 정리 - 5과목 정보보안 (0) | 2024.04.11 |
[정처기 실기] 4. 취약점 분석과 시스템 보안 구현 - 5과목 정보 보안 (0) | 2024.04.11 |
댓글