코학다식

Java 시작하기 :: OOP(1): 클래스, 변수, 메서드 본문

Programming/Java

Java 시작하기 :: OOP(1): 클래스, 변수, 메서드

copeng 2019. 9. 24. 21:24

Java 시작하기(4)

Object Oriented Programming(1): classes, variables, and methods

 

 

 

자바, 객체 지향(Object-oriented) 언어


 

  • 자바에서 대부분의 변수와 리터럴은 객체(Object)이다.
  • 객체는 클래스의 인스턴스(instance)이다.
    • 클래스는 객체의 타입이라고 할 수 있다.

 

class Employee {
    String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee();
        m.setName("Peter");
        System.out.println(m.getName());
    }
}

 

 

 

클래스(Class)의 정의


 

다시 한 번 예시를 보자.

 

class Employee {
    String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee();
        m.setName("Peter");
        System.out.println(m.getName());
    }
}

 

  • 위의 예시에서 두 개의 클래스가 정의되었다.

    • class Employee
    • public class LEC
  • 하나의 .java 파일에는 여러 개의 클래스가 있을 수 있지만, 오직 하나의 클래스만 public class가 될 수 있다.

    • public 클래스의 이름은 파일 이름과 동일해야 한다.
  • javac을 이용해서 .java 파일이 컴파일되면 정의된 각각의 클래스마다 .class 파일이 생성된다.

  • public 클래스는 main 메서드를 가지고 있는데, 이는 프로그램의 시작점이다.

  • 클래스는 변수(variable)메서드(method)를 가진다.
    • String name;은 Employee 클래스의 변수이다.
    • public void SetName(...) {...}은 Employee 클래스의 메서드이다.

 

 

 

인스턴스 변수(Instance variable)


 

class Employee {
    String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee();
        m.setName("Peter");
        System.out.println(m.getName());
    }
}

 

  • 인스턴스 변수(instance variable)static이라는 키워드의 사용 없이 클래스에서 정의된 변수이다.
    • String name;은 인스턴스 변수이다.
    • 인스턴스 변수는 객체 인스턴스에 속한다.
    • 서로 다른 객체들의 인스턴스 변수는 독립적이다. 즉, 아무런 관계가 없다.
  • Access modifier는 누가 변수에 접근할 수 있는지 정의한다.
    • String name: 같은 패키지에 있는 클래스에서 볼 수 있다.
    • public String name: 어느 클래스든 볼 수 있다.
    • protected String name: 같은 패키지의 서브클래스와 클래스에서 볼 수 있다.
    • private String name: 해당 클래스에서만 볼 수 있다.
    • 이는 메서드에도 마찬가지로 적용된다.

 

 

 

Access Modifiers


 

package startJava;

class Employee {
    String name;
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee;
        m.name = "Park";
        System.out.println(m.name);
    }
}

 

  • 위의 예시에서, LEC 클래스는 name 변수에 직접 접근할 수 있다. LEC과 Employee 클래스가 같은 패키지에 있기 때문이다.
  • 만약 name 변수가 private으로 정의되어 있다면, 그 코드는 컴파일 에러를 일으킬 것이다. LEC 클래스에서 접근할 수 없기 때문이다.

 

 

 

Method


 

  • 메서드(Method) 헤더
    • access modifier: public, protected, private, (no keyword)
    • 리턴 타입
      • 만약 리턴하는 값이 없다면, void가 된다.
    • 메서드 이름
      • 단어의 첫 글자는 대문자로 쓴다.
    • 매개변수(argument)
      • argument_class argument_name
      • 여러 개의 매개변수는 ,로 분리된다.

 

class Employee {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}

 

  • 메서드 내용

    • 만약 메서드가 리턴 값을 가지고 있다면, 메서드 끝에 return 키워드를 사용해서 값을 리턴한다.
    • this
      • 객체의 메서드가 호출되었을 때, 객체 그 자체는 this 키워드를 사용해서 참조된다.
      • 쓰지 않아도 되지만, 사용할 것을 권장한다.
  • 메서드 호출

    • object.method(arguments)

 

 

 

캡슐화(Encapsulation)


 

  • 캡슐화(Encapsulation)는 객체 지향 프로그래밍의 중요한 원칙 중 하나이다.
    • 필요한 것만 보이게 하고, 나머지는 숨긴다.
    • 클래스 밖에서 호출되는 메서드만이 public으로 정의된다.
    • 다른 메서드와 변수는 private으로 정의된다.

 

 

 

객체 생성


 

  • 객체는 new 키워드를 사용해서 생성될 수 있다.
  • 객체가 생성될 때 클래스의 생성자가 호출된다.
  • 만약 생성자가 정의되어 있지 않으면, 디폴트 생성자가 호출된다.
    • 매개변수가 없어 아무것도 하지 않는다.
    • 생성자를 정의하지 않아도 모든 클래스는 생성자를 가진다.

 

package startJava;

class Employee {
    String name;
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee;
        m.name = "Park";
        System.out.println(m.name);
    }
}

 

 

 

객체 삭제


 

  • 자바에서는 객체를 삭제할 필요가 없다.
  • 자바는 automatic garbage collection을 제공하기 때문이다!
  • Automatic garbage collection
    • 객체가 생성되면, 메모리가 할당된다.
    • 프로그램이 동작하는 동안 특정 객체는 더 이상 참조되지 않을 수 있다.
    • 그런 경우, garbage collector는 그 메모리가 다른 객체를 위해 사용될 수 있도록 자동적으로 메모리를 해제한다.
    • automatic garbage collection이 없다면 프로그래머가 명시적으로 객체를 삭제해야 한다.

 

 

 

생성자(Constructor)


 

  • 클래스를 정의할 때, 생성자가 정의될 수 있다.
    • 보통 생성자는 인스턴스 변수를 초기화한다.
  • 생성자는 클래스와 같은 이름을 가지며 리턴 타입을 가지지 않는다.
  • 매개변수를 가진 생성자를 정의할 수 있다.

 

class Employee {
    private String name;

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

    public String getName() {
        return this.name;
    }
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee();
        m.setName("Peter");
        System.out.println(m.getName());
    }
}

 

  • 다른 매개변수를 가진 여러 개의 생성자를 정의할 수 있다.
    • 어느 생성자를 호출할지는 주어지는 매개변수에 따라 다르다.
  • 이를 메서드 오버로딩(method overloading)이라고 하며, 어느 메서드에나 적용 가능하다.

 

class Employee {
    private String name;
    public Employee() {
        this.name = "NoName";
    }
    public Employee(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee("Harry Potter");
         Employee y = new Employee();
        System.out.println(m.getName());
    }
}

 

  • 생성자 안에 오버로드된 생성자를 호출할 수 있다.
  • 이 경우, 클래스 이름 대신 this를 사용한다.

 

class Employee {
    private String name;
    public Employee() {
        this("NoName");
    }
    public Employee(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}

public class LEC {
    public static void main(String[] args) {
        Employee m = new Employee("Harry Potter");
         Employee y = new Employee();
        System.out.println(m.getName());
    }
}

 

 

 

객체의 배열 생성


 

  • 객체의 배열을 정의할 수 있다.
  • 이 경우, 배열의 각각의 요소들은 따로 생성되어야 한다.
    • new Employee[3]은 세 객체를 위한 공간만을 생성한다.
class Employee {
    private String name;

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

    public String getName() {
        return this.name;
    }
}

public class LEC {
    public static void main(String[] args) {
        Employee m[] = new Employee[3];
        m[0] = new Employee("Mario");
        m[1] = new Employee("Luigi");
        m[2] = new Employee("Toad");
        System.out.println(m[0].getName());
    }
}
  • 인스턴스 변수에 초기값을 줄 수 있다.
    • 만약 변수가 초기화되지 않은 경우, 디폴트 값이 할당된다.
    • 숫자는 0, boolean은 false, 다른 객체는 null이다.
  • 지역 변수는 초기화되어야만 한다. 그렇지 않으면 오류가 발생한다.
public class LEC {
    public static void main(String[] args) {
        int local_var;
        System.out.println(locar_var); // Error: local variable not initialized
    }
}
Comments