Java 기초 개념

DevChoi·2024년 3월 10일

Class

  • 클래스는 객체를 생성하기 위한 틀 또는 설계도로 생각할 수 있다.
  • 속성(변수), 기능(메서드)를 정의할 수 있다.

Object

  • 객체는 클래스에서 정의한 속성과 기능을 가진 실체이다.
  • 객체 자체는 독립적인 상태를 가진다.

Instance

  • 클래스로부터 생성된 객체를 의미한다.
  • 객체와 인스턴스라는 용어는 자주 혼용되지만 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다.

기본형 (Primitive Type)

  • int, long, double, boolean 이 있다.
  • 단순히 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형이라 부른다.

참조형 (Refernce Type)

  • 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형 이라고 한다.

대원칙

  • 자바는 항상 변수의 값을 복사해서 대입한다.
    변수에 값을 대입하는 것은 변수에 들어있는 값을 복사해서 대입하는 것이다.
    기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사해 대입하고, 참조형이면 변수에 들어있는 참조값을 복사해 대입한다.

생성자 (Constructor)

  • 매개변수가 없는 생성자를 기본 생성자라고 한다.
  • 클래스에 생성자가 하나도 없으면 자바 컴파일러는 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 생성해준다.
  • 초기 값을 매개변수로 받아 객체에 초기값을 설정 후 객체를 생성할 수 있다.

this

  • 생성자에서 사용되며 생성자의 매개변수와 클래스 맴버변수의 이름이 같을 경우 클래스 맴버변수를 가르킨다.
  • 클래스 내에 생성자가 여러개가 있을 경우 자기 자신의 생성자를 가르킨다.
public class Test {
	String name;
    int age;
    
    Test(String name) {
    	// 아래의 생성자를 가르키는 this
    	this(name, 10);
    }
    
	Test(String name, int age) {
    	// 여기 this 는 맴버변수 name, age를 가르킨다
        this.name = name;
        this.age = age;
    }
}

오버로딩

  • 오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다
  • 같은 메서드 명으로 되어 있고, 매개변수의 타입이나 갯수가 달라야 하는 규칙을 가지고 있다.

장점

  • 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.
  • 메서드 명을 절약할 수 있다.
public class Overloading {
    public static void main(String[] args) {
        print();
        print(1);
        System.out.println(print(2, 3));
    }

    private static void print() {
        System.out.println("printMethod");
    }

    private static void print(int a) {
        System.out.println("printMethod" + a);
    }

    private static int print(int b, int c) {
        return b + c;
    }
}

// 출력
printMethod
printMethod1
5

오버라이딩(Overriding)

  • 부모 클래스 또는 인터페이스에서 정의한 메소드를 상속받는 자식 클래스는 부모 클래스 또는 인터페이스에 정의된 메소드를 무조건 재정의하여 사용해야하는 규칙을 가지고 있다.
  • 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다.
// 부모 클래스
public class ParentClass {
	void method1() {
    	System.out.println("parent.method1");
	}
    void method2(int number) {
    	System.out.println("parent.method2");
    }
}

// 자식 클래스
public class ChildClass extends ParentClass {
    @Override
    void method1() {
        System.out.println("Child.method1");
    }

    @Override
    void method2(int number) {
        System.out.println("Child.method" + number);
    }
}

// 
public class OverrideMain {
    public static void main(String[] args) {
        ChildClass child = new ChildClass();

        child.method1();
        child.method2(2);
    }
}

// 출력
Child.method1
Child.method2

접근 제어자

  • private : 모든 외부 호출을 막는다.
  • default (package-private): 같은 패키지안에서 호출은 허용한다.
  • protected : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
  • public : 모든 외부 호출을 허용한다.
  • 접근 제어자의 핵심은 속성과 기능을 외부로부터 숨기는 것이다.
  • 클래스 레벨에서는 public , default 만 사용할 수 있다. private , protected 는 사용할 수 없다.
  • 하나의 자바 파일에 public 클래스는 하나만 등장할 수 있다.
  • 하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다.

캡슐화

  • 캡슐화는 데이터와 해당 데이터를 처리하 는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말한다.
  • 캡슐화를 통해 데이터의 직접적인 변경을 방지하 거나 제한할 수 있다.
  • 속성과 기능을 하나로 묶고, 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다.

상속

  • 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해 준다
  • 이름 그대로 기존 클래스의 속성과 기능을 그대로 물려받는 것이다.
  • 상속을 사용하려면 extends 키워드를 사용 하면 된다. 그리고 extends 대상은 하나만 선택할 수 있다.
  • 부모 클래스 (슈퍼 클래스): 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
  • 자식 클래스 (서브 클래스): 부모 클래스로부터 필드와 메서드를 상속받는 클래스

Super

  • 부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있으면, 자식에서 부모의 필드나 메서드를 호출할 수 없다.
  • super 키워드를 사용하면 부모를 참조할 수 있다. super 는 이름 그대로 부모 클래스에 대한 참조를 나타낸다.

Super 생성자

  • 상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야 한다.

final (상수 - Constant)

  • 변수에 final 키워드가 붙으면 더는 값을 변경할 수 없다.
  • 대문자를 사용하며, 구분은 _ 언더스코어 구분한다.
    ex) public static final int MAX_NUMBER = 10;

다형성

  • 다형성(Polymorphism)은 이름 그대로 "다양한 형태", "여러 형태"를 를 뜻한다.
  • 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻한다.
  • 객체는 하나의 타입으로 고정되어 있다. 그런데 다형성을 사용하면 하나의 객체가 다른 타입으로 사용될 수 있다

추상 클래스 (abstract class)

  • 부모 클래스는 메서드를 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스라 한다.
  • 추상적인 개념을 제공하는 클래스이다.
  • 상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다.
// 추상 클래스
public abstract class AbstractClass {
    public abstract void method1();
    
    public void method2() {
        System.out.println("Abstract.method2");
    }
    
}

// 상속받은 자식 클래스 
public class AbstractChildClass extends AbstractClass {
    @Override
    public void method1() {
        System.out.println("AbstractChildMethod1");
    }

    @Override
    public void method2() {
        System.out.println("AbstractChildMehotd2");
    }
}

// main 
public class AbstractMain {
    public static void main(String[] args) {
        AbstractClass test = new AbstractChildClass();

        test.method1();
        test.method2();
    }
}

// 출력
AbstractChildMethod1
AbstractChildMehotd2

Interface

  • 모든 메서드가 추상 메서드인 순수 추상 클래스는 코드를 실행할 바디 부분이 전혀 없다.
  • 인스턴스를 생성할 수 없다.
  • 상속시 자식은 모든 메서드를 오버라이딩 해야 한다.
  • 주로 다형성을 위해 사용된다.
  • 멤버 변수는 public , static , final 이 모두 포함되었다고 간주된다.
  • 인터페이스의 경우는 상속받을 시 implements 을 사용하며, 여러개를 상속 받을 수 있다.

0개의 댓글