이번 포스팅에서는 자바 기초 개념에 대해 알아보도록 하겠습니다.
자바는 객체지향 프로그래밍 언어입니다.
객체지향의 핵심 개념은 객체(Object)와 클래스(Class)로 나눌 수 있습니다.
상속은 자바에서 한 클래스가 다른 클래스의 속성과 메서드를 물려받아 재사용할 수 있게 하는 기능입니다.
상속을 통해 코드의 재사용성을 높이고, 클래스 간의 계층 구조를 형성할 수 있습니다.
상위 클래스(부모 클래스): 다른 클래스에 의해 상속되는 클래스.
하위 클래스(자식 클래스): 상위 클래스를 상속받아 기능을 확장하거나 변경할 수 있는 클래스.
상속을 사용할 때 자식 클래스는 extend 키워드를 통해 부모 클래스를 상속받습니다.
class Animal {
void eat() {
System.out.println("Eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Barking...");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 부모 클래스의 메서드를 호출
dog.bark(); // 자식 클래스의 메서드를 호출
}
}
위의 예시에서 Dog 클래스는 Animal 클래스를 상속받아 eat() 메서드를 사용할 수 있습니다.
자바에는 접근 제어자(Access Modifier)가 있어서 클래스, 메서드, 변수의 접근 범위를 제한할 수 있습니다.
public: 모든 클래스에서 접근 가능합니다.
protected: 같은 패키지에 있는 클래스나 자식 클래스에서 접근할 수 있습니다.
defauilt: 아무 접근 제어자도 붙이지 않으면 default 접근 제어자가 적용되어, 같은 패키지 내에서 접근 가능합니다.
private: 해당 클래스 내에서만 잡근 가능합니다.
class Person {
public String name; // 모든 클래스에서 접근 가능
private int age; // Person 클래스 내에서만 접근 가능
protected String gender; // 같은 패키지나 상속 관계에서 접근 가능
public void setAge(int age) {
this.age = age;
}
}
name은 public이기 때문에 어디서든 접근이 가능하지만, age는 private이므로 Person클래스 외부에서 직접 접근할 수 없습니다.
static 키워드는 특정 필드나 메서드를 해당 클래스 자체에 귀속시켜 줍니다.
class MathUtil {
public static int square(int x) {
return x * x;
}
}
public class Main {
public static void main(String[] args) {
int result = MathUtil.square(5); // 객체 생성 없이 호출
System.out.println(resu;t); // 25 출력
}
}
여기서 square 메서드는 static이므로 MathUtil 클래스명으로 바로 접근이 가능합니다.
자바 애플리케이션이 실행될 떄 가장 먼저 호출되는 함수가 main 함수입니다.
자바 프로그램의 진입점(Entry Point) 역할을 하며, public static void main(String[] args) 형태로 정의됩니다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
public: 모든 곳에서 접근 가능하도록 합니다.
static: main 메서드를 실행할 때 객체를 생성하지 않고 클래스명으로 직접 호출할 수 있도록 합니다.
void: 반환값이 없습니다.
String[] args: 명령줄에서 인수를 받을 수 있는 배열입니다.
자바에서 메서드는 특정 기능을 수행하는 코드 블록입니다.
메서드의 구조는 다음과 같습니다.
접근제어자 반환타입 메서드명(매개변수) {
// 메서드 내용
}
접근제어자: 메서드의 접근 범위를 설정합니다.
반환타입: 메서드가 반환할 값의 타입을 지정합니다.
void를 사용합니다.메서드명: 메서드의 이름입니다.
매개변수: 메서드가 호출될 때 전달받는 인자들입니다.
public int add(int a, int b) {
return a + b;
}
add 메서드는 public 접근 제어자와 int 반환 타입을 가집니다.
자바에는 객체 지향 프로그래밍을 할 때 사용하는 중요한 키워드가 있으며, 객체와 클래스의 상속을 이해하는 데 도움을 줍니다.
this 키워드는 현재 객체를 참조하는 데 사용됩니다.
일반적으로, 인스턴스 변수와 메서드를 호출할 때 this를 사용하여 현재 객체의 멤버임을 명확히 할 수 있습니다.
인스턴스 변수와 매개변수 구분: 생성자나 메서드에서 인스턴스 변수와 매개변수 이름이 같을 때 구분하는 데 사용됩니다.
다른 생성자 호출: 클래스 내부의 다른 생성자를 호출할 때 this()를 사용합니다.
class Person {
private String name;
private int age;
// 생성자
public Person(String name, int age) {
this.name = name; // this를 사용하여 인스턴스 변수와 매개변수 구분
this.age = age;
}
public void display() {
System.out.println("Name: " + this.name); // this를 통해 인스턴스 변수 참조
System.out.println("Age: " + this.age);
}
}
여기서 this.name = name;에서 this.name은 인스턴스 변수 name을 가리키고, name은 생성자의 매개변수 입니다.
class Person {
private String name;
private int age;
public Person() {
this("Unknown", 0); // 다른 생성자 호출
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
위 예제에서 this("Unknown", 0);은 인수를 받아서 호출하는 다른 생성자를 가리킵니다.
이를 통해 생성자 코드의 중복을 줄일 수 있습니다.
super 키워드는 부모(상위) 클래스를 참조하는 데 사용됩니다.
주로 상속 관계에서 자식 클래스가 부모 클래스의 멤버에 접근할 때 사용합니다.
부모 클래스의 생성자 호출: 자식 클래스의 생성자에서 부모 클래스의 생성자를 명시적으로 호출할 때 사용합니다.
부모 클래스의 메서드와 변수 접근: 부모 클래스의 메서드나 변수를 사용할 때 자식 클래스에서 super를 사용해 접근할 수 있습니다.
class Animal {
String color = "Black";
public Animal() {
System.out.println("Animal created");
}
void sound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
String color = "Brown";
public Dog() {
super(); // 부모 클래스의 생성자 호출
System.out.println("Dog created");
}
void displayColor() {
System.out.println("Dog color: " + color); // 자식 클래스의 color
System.out.println("Animal color: " + super.color); // 부모 클래스의 color
}
@Override
void sound() {
super.sound(); // 부모 클래스의 sound 메서드 호출
System.out.println("Dog barking"); // 자식 클래스의 추가 기능
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.displayColor();
dog.sound();
}
}
Animal created
Dog created
Dog color: Brown
Animal color: Black
Animal sound
Dog barking
super()는 자식 클래스의 생성자에 부모 클래스의 생성자를 호출합니다.
super.color는 부모 클래스의 color 변수를 참조합니다.
super.sound()는 자식 클래스의 sound 메서드에서 부모 클래스의 sound 메서드를 호출하여 확장된 기능을 추가할 수 있게 합니다.
인스턴스는 클래스에 기반해 메모리에 실제로 만들어진 객체를 뜻합니다.
쉽게 말해, 클래스는 설계도(청사진)이고, 인스턴스는 그 설계도를 바탕으로 만들어진 실제 제품(객체)입니다.
예를 들어, Person이라는 클래스를 정의했다고 할 때, new Person() 구문을 통해 Person 클래스의 인스턴스를 생성할 수 있습니다.
class Person {
String name;
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person(); // Person 클래스의 인스턴스 생성
Person person2 = new Person(); // 또 다른 인스턴스 생성
}
}
위 코드로 person1과 person2는 Person 클래스의 인스턴스입니다.
각각 독립적인 객체로서 메모리에 존재하게 됩니다.
인스턴스 변수는 각 인스턴스에 속한 변수로, 클래스 내부에 선언되지만, 인스턴스가 만들어질 때 메모리에 할당됩니다. 따라서 각 인스턴스는 서로 다른 값을 가질 수 있습니다.
class Person {
String name; // 인스턴스 변수
int age; // 인스턴스 변수
void displayInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person();
person1.name = "Alice";
person1.age = 25;
Person person2 = new Person();
person2.name = "Bob";
person2.age = 30;
person1.displayInfo(); // Name: Alice, Age: 25
person2.displayInfo(); // Name: Bob, Age: 30
}
}
여기서 name과 age는 Person 클래스의 인스턴스 변수입니다.
person1과 person2 인스턴스는 각기 다른 값을 가지게 됩니다.
생성자는 클래스의 인스턴스가 생성될 때 호출되는 특별한 메서드입니다.
생성자의 이름은 클래스 이름과 같아야 하며, 반환 타입이 없습니다.
생성자는 객체 초기화에 주로 사용됩니다.
생성자는 new 키워드를 통해 객체를 생성할 때 자동으로 호출됩니다.
클래스에 생성자를 정의하지 않으면, 자바는 기본 생성자(매개변수가 없는 생성자)를 자동으로 제공합니다.
class Person {
String name;
int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
void displayInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("Alice", 25); // 생성자 호출
person1.displayInfo(); // Name: Alice, Age: 25
}
}
위 코드에서 Person(String name, int age)는 생성자입니다. 객체를 생성할 때 name과 age 값을 초기화할 수 있게 해줍니다.
생성자의 매개변수는 생성자를 호출할 때 전달할 수 있는 인수(parameter)입니다.
매개변수를 통해 생성 시 객체의 인스턴스 변수를 초기화할 수 있습니다.
class Person {
String name;
int age;
// 생성자
public Person(String name, int age) { // 매개변수 name, age
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("Alice", 25); // "Alice", 25가 매개변수로 전달됨
Person person2 = new Person("Bob", 30); // "Bob", 30이 전달됨
}
}
위 코드에서 Person(String name, int age)의 name과 age는 생성자의 매개변수입니다.
생성자를 호출할 때 전달된 값 "Alice", 25, "Bob", 30이 각각 name과 age에 초기화됩니다.
오늘은 자바의 기초 개념에 대해 알아보았습니다.
잘 숙지하여 추후 자바를 사용할 때 잘 활용하시기 바랍니다.
감사합니다. 😌