자바스터디 - 5주차

megaseunghan·2022년 2월 27일
0

자바스터디

목록 보기
7/15
post-thumbnail

자바스터디 5주차

목표

자바의 Class에 대해 학습하세요

학습할 것 (필수)

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

클래스란 ?

모든 데이터를 객체로 취급하는 객체 지향 프로그래밍에서 객체를 만들어내기 위한 설계도와 같은 개념을 클래스라고 한다. 또는 객체를 정의하는 틀이라고 볼 수도 있다.

클래스의 구성 - 필드

멤버로 속성을 표현하는 역할, 클래스의 필드란 클래스에 포함된 변수를 의미한다. 선언 위치에 따라 다음과 같이 구분된다.

public class 클래스 { 
  static int classVariable; // 클래스 변수
  String instanceVariable; // 인스턴스 변수
  
  void method() {
    int localVariable; // 지역 변수
  } 
}
  1. 클래스 변수

    : static키워드를 가지는 변수, 인스턴스를 생성하지 않고 바로 사용할 수 있다.(그래서 공유변수라고도 불린다.) 모든 인스턴스가 공유해야 하는 값을 유지하기 위해 사용한다.

  2. 인스턴스 변수

    : 클래스 영역에 위치한 변수 중 static 키워드를 가지지 않는 변수를 인스턴스 변수라고 한다. 인스턴스마다 고유한 값을 가진다.

  3. 지역 변수

    : 생성자, 메소드, 초기화 블록 내에서 위치한 변수를 지역 변수라고 한다. 사용 전 초기화를 하지 않는다면 컴파일 에러 valiable XXX might not have been initialized가 발생한다.

클래스 변수 & 인스턴스 변수의 초기값

변수의 타입초기값
char'\u0000'
byte, short, int0
long0L
float0.0F
double0.0 || 0.0D
booleanfalse
배열, 인스턴스 등null

변수 라이프 타임

변수생성 시기소멸 시기저장 메모리사용 방법
클래스 변수클래스가 메모리에 올라갈 때프로그램이 종료될 때메소드 영역클래스 이름.변수 이름
인스턴스 변수인스턴스가 생성될 때인스턴스가소멸될 때힙 영역인스턴스이름.변수이름
지역 변수블록 내에서 변수의 선언문이 실행될 때블록을 벗어날 때스택 영역변수이름

클래스 정의하는 방법

클래스는 추상화개념을 직접 구현한 것이라고 할 수 있다. 자바에서는 유용하게 사용할 수 있는 클래스가 많이 정의되어 제공하고 있다. 또한 사용자가 직접 클래스를 추가할 수도 있다.

접근제어자 키워드 클래스이름 {
  // 멤버
  클래스 필드1;
  클래스 필드2;
  
  클래스 메소드1();
  클래스 메소드2();
}

클래스 작성 규칙

작성 규칙예시
하나 이상의 문자로 이루어져야 함Car, Human, Member
첫 번째 글자에는 숫자가 올 수 없다.1Member ( X ), Member ( O )
'$','_' 외의 특수문자는 사용할 수 없다.$Member ( O ), _Member ( O ), @Member ( X )
자바 키워드는 사용할 수 없다int, boolean 등

객체 만드는 방법 (new 키워드 이해하기)

클래스는 설계도이다. 이 설계도를 이용해서 객체를 만드는 것을 인스턴스화 한다고 한다. 인스턴스화에 필요한 키워드가 new이다. 이 연산자는 클래스이름 인스턴스변수이름 = new 클래스(); 이렇게 사용하면 된다.

  • new 연산자로 클래스로부터 객체를 생성하면 이 객체는 힙 영역에 생성되고, 인스턴스가 소멸될 때 함께 힙 영역에서 소멸된다.
  • System.out.println(객체); 를 통해 출력을 해보면 객체의 주소가 나오게 된다.
  • 생성된 객체의 필드, 메소드를 사용하기 위해서는 . 참조 연산자를 사용한다.

메소드 정의하는 방법

메소드를 정의하는 방법에 대해서 알아보자

클래스의 구성 - 메소드

메소드란 어떤 특정 작업을 수행하기 위한 명령문의 집합이다.

중복되는 코드를 사용하는 반복적 프로그래밍을 안하게 도와준다. 또, 가독성도 좋아진다. 또또, 유지보수도 쉽다.

메소드 정의

접근제어자 반환타입 메소드이름 (매개변수 목록) { // 선언부
  // 구현부
}
  1. 접근 제어자

    : 총 4개로 이루어져있다. 접근이 가능한 순으로 정리하면 public > protected > default > private 순이다.

    접근제어자같은 클래스 멤버같은 패키지 멤버자식 클래스 멤버그 외
    publicOOOO
    protectedOOXX
    defaultOOXX
    privateOXXX
  2. 반환 타입 (return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시한다. 모든 타입으로 가능하며, 반환할 타입이 없을때는 void를 사용한다.

  3. 메소드 이름 : 메소드를 호출하기 위한 이름을 명시한다.

  4. 매개 변수 목록 : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시한다. 없어도 무관하며, 복수로도 가능하다.

  5. 구현부 : 메소드의 기능을 수행하는 명령문의 집합이다.

메소드 구분

static 키워드의 여부에 따라 다음과 같이 구분한다.

class Method {
  int a = 10, b =20; // 인스턴스 변수
  int add() { return a + b; }  // 인스턴스 메소드
  static int add(int x, int y) { return x + y; } // 클래스 메소드
}

public class addExample {
  public static void main(String[] args) {
    System.out.println(Method.add(5, 10)); // 클래스 메소드 호출 후 출력
    Method method = new Method(); // 인스턴스 생성
    System.out.println(method.add()); // 인스턴스 메소드 호출
  }
}
  1. 클래스 메소드

    : 클래스 메소드는 클래스 변수와 같이 인스턴스를 생성하지 않고 사용이 가능하다. 메소드 내부에서 인스턴스 변수나 인스턴스 메소드를 사용하지 못한다.

  2. 인스턴스 메소드

    : static 키워드를 가지지 않는 메소드

메소드 호출

자바에서는 정의한 메소드를 참조 연산자인 . 을 사용해서 호출한다.

객체 참조 변수명.메소드명();
객체 참조 변수명.메소드명(인수1, 인수2, ...); 

생성자 정의하는 방법

생성자를 정의하는 방법에 대해서 알아보자.

클래스의 구성 - 생성자

클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다. 이렇게 생성된 객체는 모든 인스턴스 변수가 초기화 되지 않은 상태인데, 사용자가 원하는 값으로 인스턴스 변수를 초기화하는 방식을 생성자가 도와준다.

생성자는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있다. 생성자의 이름은 클래스의 이름과 같아야한다.

생성자의 특징

  1. return값이 없지만 void를 선언하지 않는다.
  2. 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
  3. 객체를 초기화하는 방법이 여러 개 존재할 경우에는 메소드 오버로딩처럼 오버로딩 할 수 있다.

생성자 선언

public class MyClass {
  private int intField = 10;
  
  public MyClass() {} // 생성자 선언하지 않을 시, 기본 생성자. 
  
  public MyClass(int intField) { // 생성자 오버로딩 및 사용자 정의 생성자
    System.out.println("MyClass 인스턴스 생성 완료.");
    this.field = field;
  }
}

this 키워드 이해하기

객체가 자기 자신을 가리키는 키워드를 this라고 한다. 자신의 메모리 주소를 담고 있는 키워드이다.

사용 형태

  1. 자신의 속성값을 가리키기 위해 사용함
public class WhatIsThis {
  String name;
  int age;
  
  public String getName() {
    return name;
  }
  public String setName(String name) {
    this.name = name; // 객체의 name을 인수 name으로 초기화
  }
  .
  .
  .
}
  1. 클래스 내부에서 오버로딩된 다른 생성자를 호출할 때 사용함
public class WhatIsThis {
  String name;
  int age;
  
  public WhatIsThis(String name) {
    this(name, 25); // 타 생성자를 호출
  }
  
  public WhatIsThis(String name, int age) {
    this.name = name;
    this.age = age; 
  }
}
  1. 객체가 자신의 참조값을 전달하고 싶을 때 사용함
public class WhatIsThis {
  String name;
  int age;
  
  public WhatIsThis getWIT() {
    return this;
  }
}

출처

0개의 댓글