본문 바로가기

Java/문법

[Java] 핵심 기본편 - 클래스(변수, 메소드, This, 생성자, Getter&Setter, 접근 제어자, 패키지, 상속, 메소드 오버라이딩, 다형성, Super, 참조, Final, 열거형)

1. 클래스

클래스

  • 클래스: 데이터와 기능을 포함하는 코드 묶음, 설계도 역할
  • 객체: 클래스로부터 만들어진 실체
    • 종이접기 책이 클래스라면, 책을 보고 만든 종이학이 객체
  • class 클래스명{

    }
// 클래스 Person
class Person {

}

// 클래스 Person으로 만든 객체 p
public static void main(String[] args) {
Person p = new Person(); // 새로운 객체를 만들기 위해서 new 키워드를 쓰고 클래스명();
}

 

인스턴스 변수

  • 인스턴스 변수: 클래스 내에 선언된 변수
  • class 클래스명{
    인스턴스 변수1 ...
    }
  • 변수명 뒤에 점(.)으로 인스턴스 변수에 접근 가능
  • 객체마다 서로 다른 값을 가질 수 있음
// 클래스 - 인스턴스 변수
class Person {
    String name; // 인스턴스 변수
    int age; // 인스턴스 변수
}

// 객체 - 인스턴스 변수 선언
public static void main(String[] args) {
    Person p = new Person(); // 객체
    p.name = "철수"; // 인스턴스 변수
    p.age = 20; 인스턴스 변수
}

 

클래스 변수

  • 클래스 변수: 클래스 내에 static으로 선언된 변수
    • 쉽게 말해 모든 객체가 공유하는 변수를 말함
  • class 클래스명{
    static 클래스 변수1 ...
    }
  • 객체를 만들 필요 없이 클래스명으로 접근 가능
  • 클래스명 뒤에 점(.)으로 클래스 변수에 접근 가능
// 클래스 - 클래스 변수
class Person {
    String name; // 인스턴스 변수
    int age; // 인스턴스 변수
    static int personCount = 0; // 클래스 변수(사람의 수를 카운트)
}

// 클래스 변수는 객체를 만들 필요 없이 클래스명으로 바로 접근 가능
public static void main(String[] args) {
    Person.personCount = 10; // 클래스명.클래스변수명
    System.out.println(Person.personCount); // 10
}

 

인스턴스 메소드

  • 인스턴스 메소드: 클래스 내에 정의된 메소드
  • class 클래스명{
    인스턴스 메소드1 ...
    }
  • 객체명 뒤에 점(.)으로 인스턴스 메소드 호출
// 클래스 - 인스턴스 메소드
class Person {
    String name; // 인스턴스 변수
    int age; // 인스턴스 변수
    static int personCount = 0; // 클래스 변수
    public void introduce() { // 인스턴스 메소드: introduce
        System.out.println("이름: " + name);
        System.out.println("나이: " + age);
    }
}

// 인스턴스 메소드 호출
public static void main(String[] args) {
    Person p = new Person(); // 객체 생성
    p.name = "철수"; // p.인스턴스 변수
    p.age = 20; // p.인스턴스 변수
    p.introduce(); // p.인스턴스 메소드 호출
}

/* 실행결과:
이름: 철수
나이: 20 */

 

클래스 메소드

  • 클래스 메소드: 클래스 내에 static으로 정의된 메소드
  • class 클래스명{
    static 클래스 메소드1 ...
    }
  • 클래스명 뒤에 점(.)으로 클래스 메소드 호출
// 클래스 - 클래스 메소드
class Person {
    String name; // 인스턴스 변수
    int age; // 인스턴스 변수
    static int personCount = 0; // 클래스 변수
    public static void printPersonCount() { // 클래스 메소드
        System.out.println(personCount); 
    }
}

// 클래스명을 통해서 클래스 메소드 호출
public static void main(String[] args) {
    Person.personCount = 10; // 클래스 변수
    Person.printPersonCount(); // 클래스 메소드 호출
}

// 실행결과: 10

 

This

  • This: 자기 자신 (클래스 내에서 인스턴스 or 지역 변수를 구분하기 위해 사용함)
  • this.인스턴스변수;
// 클래스 - This
class Person {
   String name; // 인스턴스 변수
   public void setName(String name) { // 메소드: setName (전달값: String name)
       this.name = name;
       // Person 클래스 내 name 변수와 setName 메소드 내 전달값 name 구분하기 위해 this.을 붙임
       // this.name은 Person 클래스의 name을 가리키게 됨
       // this 없이 그냥 name을 쓰게 되면 setName 메소드 내 전달값 name을 가리키게 됨
    }
}

// This
public static void main(String[] args) {
    Person p = new Person(); // 객체 p
    p.setName("철수"); 
    System.out.println(p.name);
}

// 실행결과: 철수

 

생성자

  • 생성자: 객체가 생성될 때 호출되는 메소드
  • class 클래스명(전달값){
    초기화 명령
    }
// 클래스 - 생성자
class Person { // Person 클래스
    String name; // 인스턴스 변수
    int age; // 인스턴스 변수
    Person(String name, int age) { // Person 메소드(전달값)
        this.name = name; // 초기화 작업
        this.age = age; // 초기화 작업
    }
}

// 객체 - 생성자
public static void main(String[] args) {
	Person p = new Person("철수", 20); // String name에 "철수", age에 20이 대입됨
}

 

Getter & Setter

  • Getter: 인스턴스 변수의 값을 반환해 주는 메소드
    • 반환형 get이름(){
      return 반환값;
      }
  • Setter: 인스턴스 변수의 값을 설정해 주는 메소드
    • void set이름(전달값){
       
      }
// Getter: 인스턴스 변수의 값을 반환
class Person {
    int age; // 인스턴스 변수
    public int getAge() { // 반환형: int, get이름(): getAge()
        return age; // 반환값: age
    }
}

// Setter: 인스턴스 변수의 값을 설정
class person {
    int age; // 인스턴스 변수
    public void setAge(int age) { // void set이름(전달값): setAge(int age)
        this.age = age;
    }
}

// Getter & setter
public static void main(String[] args) {
    Person p = new Person(); // p 객체
    p.setAge(20); // 객체.setAge를 통해 값 설정(setter 메소드 이용)
    System.out.println(p.getAge()); // 객체.getAge를 통해 값 가져오기(getter 메소드 이용)
}

 

접근 제어자

  • 접근 제어자: 접근 권한 지정
  • 접근 제어자 class 클래스명{
    접근 제어자 인스턴스 변수 or 메소드
    }
접근 제어자의 종류 접근 가능 범위
private 해당 클래스 내에서만
public 모든 클래스에서
default 같은 패키지 내에서만 (아무것도 적지 않았을 때 default 적용)
protected 같은 패키지 내에서 or 다른 패키지인 경우 자식 클래스에서
// 접근 제어자 예시
class Person {
    private int age; // 'private' 접근 제어자
    public int getAge() { // 'public' 접근 제어자
        return age;
    }
}

 

패키지

  • 패키지: 관련 클래스 or 인터페이스들을 그룹화 하는 것
  • package 패키지명;
    • 패키지를 폴더 구조와 비교해 보았을 때 다음과 같이 비교해 볼 수 있음
    • package sample 안에 class MyClass가 있다!

  • 다른 패키지에 있는 클래스를 사용하기 위해서는 'import'
    • import 패키지명.클래스명;
      • import java.util.Random;
      • java 패키지 밑에 util 패키지 밑에 Random 클래스를 사용하고자 할 때
    • 패키지 내 여러 클래스를 사용하는 경우: *
      • import 패키지명.*
      • import java.util.*;
// import package
import java.util.Random;

public class MyClass {
    public static void main(String[] args) {
        Random random = new Random(); // Random 클래스는 import를 해 왔기 때문에 사용 가능
        int num = random.nextInt();
    }
}

 

상속

  • 상속: 특정 클래스의 기능을 재사용 및 확장하는 것
    • 부모 클래스: 특정 클래스
    • 자식 클래스: 재사용 및 확장하는 클래스
    • 부모 클래스에 있는 기능은 상속하고, 없는 기능만 새롭게 구현하면 됨

  • class 자식 클래스명 extends 부모 클래스명{
     
    }
// 상속
calss Student extends Person { // 부모클래스: Person, 자식클래스: Student
	String school; // 자식클래스에서 새로운 기능 구현: String school;
}

 

메소드 오버라이딩

  • 메소드 오버라이딩: 부모 클래스의 메소드를 재정의하는 것(부모 클래스의 메소드 덮어쓰기)
// 메소드 오버라이딩
class Person { // 부모 클래스: Person
    public void introduce() { // Person 객체 생성시 inroduece 메소드 호출하면
        System.out.println("사람입니다");
    }
}

class Student extends Person { // 자식 클래스: Student
    public void introduce() { // Student 객체 생성시 inroduece 메소드 호출하면
        System.out.println("학생입니다");
    }
}

 

다형성

  • 다형성: 여러 형태로 동작할 수 있는 성질
  • public static void main(String[] args) {
        Person person = new Person(); // person 객체
        Person student = new Student(); // student 객체
        person.introduce(); // 사람입니다
        student.introduce(); // 학생입니다
    }
    • main 메소드에서 객체를 만들 때 앞쪽에는 모두 Person 클래스를 적음
    • 뒤쪽에서는 new Person();, new Student(); 서로 다른 객체를 만듦
    • 서로 다른 객체지만 부모 클래스인 Person로 똑같이 참조할 수 있음 => 다형성
// 메소드 오버라이딩
class Person { // 부모 클래스: Person
    public void introduce() { // Person 객체 생성시 inroduece 메소드 호출하면
        System.out.println("사람입니다");
    }
}

class Student extends Person { // 자식 클래스: Student
    public void introduce() { // Student 객체 생성시 inroduece 메소드 호출하면
        System.out.println("학생입니다");
    }
}

// 다형성
public static void main(String[] args) {
    Person person = new Person(); // person 객체
    Person student = new Student(); // student 객체
    person.introduce(); // 사람입니다
    student.introduce(); // 학생입니다
}

 

Super

  • Super: 부모 클래스에 접근하기 위해 사용
    • super.부모 클래스 변수;
    • super.부모 클래스 메소드();
    • super();
// 부모 클래스: Person
class Person {
    int age; // 인스턴스 변수
    Person(int age) { // 생성자
        this.age = age;
    }
}

// 자식 클래스: Student
class Student extends Person {
    String school;
    Student(int age, String school) { // 생성자
        super(age); // 부모 클래스에 있는 age 생성자를 super로 불러옴
        this.school = school;
    }
}

 

참조

  • 참조: 객체의 메모리 주소를 가리키는 것
  • 기본 자료형을 제외한 모든 자료형은 참조 자료형
    • 클래스, 인터페이스, 배열, 열거형 ... (String)

 

Final

  • Final: 변경할 수 없게 쓰는 키워드
  • 변경할 수 없게 만들기 때문에 '초기값'을 반드시 설정해 주어야 함
// Final
class Person {
    final String name = "철수"; // final: name 값은 절대 바꿀 수 없는 변수가 되는 것
    // 절대 바꿀 수 없기 때문에 '초기값'을 설정해 주어야 하는 특징이 있음
    
    public final void introduce() { // final: introduce 메소드를 절대 새롭게 정의할 수 없음
    // Student 자식 클래스에서 introduce 메소드 오버라이딩 불가
        System.out.println("사람입니다.");
    }
}

 

열거형

  • 열거형: 특수한 형태의 클래스로 상수들의 묶음
  • enum 열거형명{
    상수명1 ...
    }
  • switch문에서 유용하게 사용할 수 있음
// 열거형 - 성별 정의
enum Gender {
    MALE,
    FEMALE
}

// Person 클래스
class Person {
    Gender gender; // 열거형명과 변수명
    public void setGent(Gender gender) {
        this.gender = gender;
    }
}

// main 메소드
public static void main(String[] args) {
    Person person = new Person();
    person.setGender(Gender.MALE); // MALE
    
    switch (person.gender) {
        case MALE: System.out.println("남자"); break;
        case FEMALE: System.out.println("여자"); break;
    }
}

참고 영상: 나도코딩 - 자바 무료 강의 2시간 완성(1분 자바)

https://youtu.be/DNCBaeCoMug?si=VM02QD9igeT561pp

 

반응형