전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

이론/Java

OOP - 클래스와 객체

2021. 7. 13. 21:53

복습하며 내용을 간단하게 정리하였다.

클래스와 객체

  1. 클래스 선언
  2. 참조 타입
  3. String 클래스
  4. 필드 선언
  5. 메소드
  6. 변수 범위와 static
  7. 생성자
  8. this 키워드
  9. 메소드 오버로딩
  10. 생성자 오버로딩
  11. 패키지

클래스와 객체

1. 클래스 선언

자바에서 객체를 만들기 위해서는 반드시 클래스를 만들어야한다. 간단하게 유명한 비유를 적어보자면 붕어빵을 만든다고 할 때, 붕어빵이 객체이고 붕어빵 틀이 클래스이다. Car라는 클래스를 만들어보자.

public class Car
{
}

이렇게 클래스만 만들었다고 하여 자동차 객체가 만들어진 것은 아니다. Car 객체를 만들어보자.

public class CarMake
{
    public static void main(String[] args)
    {
        Car c1=new Car();
        Car c2=new Car();
    }
}

- new 연산자는 생성자를 이용하여 메모리에 객체를 만들라는 명령을 한다.
- 메모리에 만들어진 객체를 인스턴스(instance)라고 한다.
- 위 코드에서 만들어진 객체를 참조하는 변수가 c1과 c2이다.
- 위 코드의 결과로 Car라는 객체가 2개 만들어지고, 그것을 참조하는 c1과 c2가 만들어진다.

2. 참조 타입

참조 변수란 것은 무엇일까. 기본형 타입 변수를 제외한 모든 변수가 다 참조형 타입이다. 대표적으로, 배열, 스트링, 클래스가 참조형이다. 예시를 들어보겠다.
String str = new String("Hello, world!");
여기서 str이 참조형 변수인데 이 변수가 인스턴스를 가지고 있는 것이 아니라 가리키는 것이 참조한다는 것의 의미이다. 즉, str에 메모리의 위치 값이 저장된다.

3. String 클래스

String 클래스에 대해 한번 알아보자.
String 클래스는 인스턴스를 생성할 수 있는 방식이 2가지가 있다. new를 이용하지 않는 방식과 이용하는 방식이다.

  1. new 연산자를 이용하지 않는 방식
    String str1 = "Hello, world!";
    String str2 = "Hello, world!";

- "Hello, world!"라는 문자열이 메모리 중 상수가 저장되는 영역에 저장된다.
- 두번째 줄에서 "Hello, world!"라는 문자열 상수가 이미 만들어져 있으므로 str1이 참조하는 인스턴스를 str2도 참조한다.

  1. new 연산자를 이용하는 방식
    String str3 = new String("Hello, world!");
    String str4 = new String("Hello, world!");

- new 연산자를 이용하면 인스턴스가 무조건 새롭게 만들어진다.
- 두번째 줄에서 새롭게 인스턴스가 만들어지므로 str3과 str4가 참조하는 인스턴스는 서로 다르다.

4. 필드 선언

아까 자동차 클래스를 만들었었다. 자동차는 이름, 번호 등의 속성을 가지고 있고, 달리고 멈추는 등의 기능이 있다. 여기서 자동차가 가지고 있는 속성을 자바에서는 필드(field)라고 지칭한다. 한번 코드로 보자.

- 이름과 번호를 필드로 가진 Car 클래스 선언

public class Car
{
    String name;
    int number;
}




- Car 클래스 인스턴스화

Car c1 = new Car();
Car c2 = new Car();
// Car 인스턴스가 2개 만들어지고, 각 객체별로 name과 number를 가진다.




- 속성 이용해보기

c1.name = "포르쉐";
c1.number = "0000";

c2.name = "아우디";
c2.number = "1234";

5. 메소드

아까 자동차는 이름, 번호 등의 속성을 가지고 있고, 달리고 멈추는 등의 기능이 있다고 하였다. 여기서 기능에 해당하는 것이 메소드이다. 아래와 같이 구현할 수 있다.

public class Car
{
    public void GO()
    {
        System.out.println("전진합니다.");
    }
}




메소드를 사용하려면 메소드가 정의된 클래스가 생성되어야한다. 한번 메소드를 사용해보자.

public class CarMake
{
    public static void main(String[] args)
    {
        Car c1 = new Car();
        c1.GO();
    }
}

6. 변수의 범위와 static

static이 의미하는 바가 무엇인지 알아보자.
- static은 메모리에 딱 한번 할당되어 프로그램이 종료될 때 해지되게하는 키워드이다.
: static하게 선언된 것은 저장 공간이 딱 하나 생성된다. 그러므로 static한 변수는 공유된다라고 할 수 있다.

- static한 필드나 static한 메소드는 클래스가 인스턴스화되지 않아도 사용할 수 있다.

- static한 메소드 안에서는 인스턴스 변수를 사용할 수 없다.
: 인스턴스 변수는 인스턴스가 생성되어야만 사용가능 하다. static 메소드를 호출할 때, 인스턴스가 생성되어있는지의 여부를 알 수 없기에 static 메소드 내에서 인스턴스 변수의 사용을 허용하지 않는다.

public class Variable
{
    int GlobalScope = 10;
    static int staticval = 10;

    public void scopeTest(int x)
    {
        int LocalScope = 10;
        System.out.println(GlobalScope);
        System.out.println(LocalScope);
        System.out.println(x);
    }

    public static void main(String[] args)
    {
        System.out.println(GlobalScope); // 오류
        System.out.println(LocalScope); // 오류
        System.out.println(x); // 오류
        System.out.println(staticval); // 사용 가능
    }
}

- 클래스의 속성으로 선언된 변수 GlobalScope 의 사용 범위는 클래스 전체이다.
- 매개변수로 선언된 x는 블럭 바깥에 존재하기는 하지만, 메소드 선언부에 존재하므로 사용 범위는 해당 메소드 블럭 내이다.
- 메소드 블럭 내에서 선언된 LocalScope 변수의 사용 범위는 메소드 블럭 내이다.
- main 메소드는 static 메소드이다. 그러므로 static 하지 않은 필드들을 사용할 수 없는 것을 볼 수 있다.

7. 생성자

모든 클래스는 인스턴스화할 때 생성자를 이용한다. 생성자의 특징을 알아보자.

- 생성자의 특징

  • 생성자는 리턴 타입이 없다.
  • 생성자를 프로그래머가 만들지 않으면 매개 변수가 없는 생성자가 컴파일할 때 자동으로 만들어지고, 이를 기본 생성자라고 한다.
  • 생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 자동으로 만들어지지 않는다.

- 생성자의 역할

  • 생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.

자동차가 객체가 될때 반드시 이름을 가지도록 하려면, Car 클래스를 아래와 같이 만들어야 한다.

public class Car
{
   String name;
   int number;

   public Car(String n)
   {
      name = n;
   }
}




위의 Car 클래스를 이용하여 Car 인스턴스를 만들어보자.

public class CarMake
{
   public static void main(String args[])
   {
      Car c1 = new Car("포르쉐");
      Car c2 = new Car("아우디");
      // Car c3 = new Car(); // 오류
   }
}

기본 생성자가 아닌 생성자를 만들어줬기에, Car 클래스가 기본 생성자를 가지지 않음을 볼 수 있다.

8. this 키워드

this는 현재 객체, 자기 자신을 의미한다. this를 사용해보자.

public class Car
{
   String name;
   int number;

   public Car(String n)
   {
      name = n;
   }
}

여기서 n이라는 변수는 무엇을 의미하는지 한 눈에 알아보기 힘들다. 그래서 name으로 바꿔주는 것이 좋다.

public Car(String name)
{
   name = name;
}

name = name; 이라고 코드를 바꾸면, 가깝게 선언된 변수를 우선 사용하기 때문에 name = name; 이라는 코드는 매개변수의 name 값을 매개변수 name에 대입하라는 의미가 된다. 이런 경우 필드라는 것을 컴파일러와 JVM에게 알려주기 위해 this키워드를 사용해야 한다.

public Car(String name)
{
   this.name = name;
}

위와 같은 경우 말고도 클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다.

9. 메소드 오버로딩

매개변수의 유형과 갯수를 다르게 하여 같은 이름의 메소드를 여러 개 가질 수 있게하는 것이다. 예시를 들어보겠다.

class Plus
{
   public int plus(int x, int y)
   {
      return x + y;
   }

   public int plus(int x, int y, int z)
   {
      return x + y + z;
   }

   public String plus(String x, String y)
   {
      return x + y;
   }
}

10. 생성자 오버로딩

생성자도 메소드와 같이 오버로딩할 수 있다. 예시를 들어보겠다.

public class Car
{
    String name;
    int number;

    public Car()
    {
    }

    public Car(String name)
    {
        this.name = name;
    }

    public Car(String name, int number)
    {
        this.name = name;
        this.number = number;
    }
}

11. 패키지

패키지란 서로 관련이 있는 클래스 또는 인터페이스들을 묶어 놓은 묶음이다. 패키지를 사용함으로써 클래스들이 필요할 때만 사용될 수 있도록 하고, 클래스를 패키지 이름과 함께 계층적인 형태로 사용함으로써 다른 그룹에 속한 클래스와 발생할 수 있는 클래스 이름간의 충돌을 막아줌으로 클래스의 관리를 편하게 해준다.
패키지를 사용할 때는 import 구문을 이용하면 된다.

저작자표시 (새창열림)

'이론 > Java' 카테고리의 다른 글

final 키워드 헷갈리는 부분 정리  (0) 2021.11.11
java.lang 패키지 / 오토 박싱/ 오토 언박싱  (0) 2021.07.28
Java Object 클래스  (0) 2021.07.27
Java 콘솔 입출력(I/O)  (0) 2021.07.14
OOP - 상속  (0) 2021.07.14
    '이론/Java' 카테고리의 다른 글
    • java.lang 패키지 / 오토 박싱/ 오토 언박싱
    • Java Object 클래스
    • Java 콘솔 입출력(I/O)
    • OOP - 상속
    모달조아
    모달조아

    티스토리툴바