[Java] 기초 개념

Juni_woo·2024년 10월 30일

Java

목록 보기
5/8
post-thumbnail

이번 포스팅에서는 자바 기초 개념에 대해 알아보도록 하겠습니다.




1. 객체지향 프로그래밍(OOP)


자바는 객체지향 프로그래밍 언어입니다.
객체지향의 핵심 개념은 객체(Object)와 클래스(Class)로 나눌 수 있습니다.

  • 객체(Object): 객체는 실세계의 사물을 코드로 표현한 것입니다.
    • 예를 들어, 자동차, 사람, 동물 등이 객체가 될 수 있습니다.
  • 클래스(Class): 클래스는 객체의 설계도 역할을 합니다.
    • 예를 들어, '자동차'라는 클래스를 만들고, 이를 통해 다양한 자동차 객체를 만들 수 있습니다.

2. 상속(Inheritance)


상속은 자바에서 한 클래스가 다른 클래스의 속성과 메서드를 물려받아 재사용할 수 있게 하는 기능입니다.

상속을 통해 코드의 재사용성을 높이고, 클래스 간의 계층 구조를 형성할 수 있습니다.

  • 상위 클래스(부모 클래스): 다른 클래스에 의해 상속되는 클래스.

  • 하위 클래스(자식 클래스): 상위 클래스를 상속받아 기능을 확장하거나 변경할 수 있는 클래스.

상속을 사용할 때 자식 클래스는 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() 메서드를 사용할 수 있습니다.


3. 접근 제어자(Access Modifier)


자바에는 접근 제어자(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;
    }
}

namepublic이기 때문에 어디서든 접근이 가능하지만, ageprivate이므로 Person클래스 외부에서 직접 접근할 수 없습니다.


4. Static 키워드


static 키워드는 특정 필드나 메서드를 해당 클래스 자체에 귀속시켜 줍니다.

  • static 변수: 객체가 아니라 클래스에 종속됩니다.
    • 같은 클래스로 만든 모든 객체가 이 변수를 공유합니다.
  • 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 클래스명으로 바로 접근이 가능합니다.


5. 메인 함수(Main Method)


자바 애플리케이션이 실행될 떄 가장 먼저 호출되는 함수가 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: 명령줄에서 인수를 받을 수 있는 배열입니다.


6. 메서드 구조


자바에서 메서드는 특정 기능을 수행하는 코드 블록입니다.
메서드의 구조는 다음과 같습니다.

접근제어자 반환타입 메서드명(매개변수) {
	// 메서드 내용
}
  • 접근제어자: 메서드의 접근 범위를 설정합니다.

  • 반환타입: 메서드가 반환할 값의 타입을 지정합니다.

    • 반환값이 없다면 void를 사용합니다.
  • 메서드명: 메서드의 이름입니다.

  • 매개변수: 메서드가 호출될 때 전달받는 인자들입니다.

public int add(int a, int b) {
	return a + b;
}

add 메서드는 public 접근 제어자와 int 반환 타입을 가집니다.


7. 키워드


자바에는 객체 지향 프로그래밍을 할 때 사용하는 중요한 키워드가 있으며, 객체와 클래스의 상속을 이해하는 데 도움을 줍니다.

this 키워드

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 키워드는 부모(상위) 클래스를 참조하는 데 사용됩니다.
주로 상속 관계에서 자식 클래스가 부모 클래스의 멤버에 접근할 때 사용합니다.

주요 용도

  • 부모 클래스의 생성자 호출: 자식 클래스의 생성자에서 부모 클래스의 생성자를 명시적으로 호출할 때 사용합니다.

  • 부모 클래스의 메서드와 변수 접근: 부모 클래스의 메서드나 변수를 사용할 때 자식 클래스에서 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 메서드를 호출하여 확장된 기능을 추가할 수 있게 합니다.


8. 인스턴스(Instance)


인스턴스는 클래스에 기반해 메모리에 실제로 만들어진 객체를 뜻합니다.

쉽게 말해, 클래스는 설계도(청사진)이고, 인스턴스는 그 설계도를 바탕으로 만들어진 실제 제품(객체)입니다.

예를 들어, 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(); // 또 다른 인스턴스 생성
    }
}

위 코드로 person1person2Person 클래스의 인스턴스입니다.
각각 독립적인 객체로서 메모리에 존재하게 됩니다.


9. 인스턴스 변수(Instance Variable)


인스턴스 변수는 각 인스턴스에 속한 변수로, 클래스 내부에 선언되지만, 인스턴스가 만들어질 때 메모리에 할당됩니다. 따라서 각 인스턴스는 서로 다른 값을 가질 수 있습니다.

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
    }
}

여기서 nameagePerson 클래스의 인스턴스 변수입니다.
person1person2 인스턴스는 각기 다른 값을 가지게 됩니다.

10. 생성자(Constructor)


생성자는 클래스의 인스턴스가 생성될 때 호출되는 특별한 메서드입니다.
생성자의 이름은 클래스 이름과 같아야 하며, 반환 타입이 없습니다.
생성자는 객체 초기화에 주로 사용됩니다.

  • 생성자는 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)는 생성자입니다. 객체를 생성할 때 nameage 값을 초기화할 수 있게 해줍니다.

11. 생성자의 매개변수(Constructor Parameters)


생성자의 매개변수는 생성자를 호출할 때 전달할 수 있는 인수(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)nameage는 생성자의 매개변수입니다.

생성자를 호출할 때 전달된 값 "Alice", 25, "Bob", 30이 각각 nameage에 초기화됩니다.




🏁마무리

오늘은 자바의 기초 개념에 대해 알아보았습니다.
잘 숙지하여 추후 자바를 사용할 때 잘 활용하시기 바랍니다.

감사합니다. 😌

profile
개발 공부!

0개의 댓글