코학다식
Java 시작하기 :: OOP(1): 클래스, 변수, 메서드 본문
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
- 여러 개의 매개변수는
,
로 분리된다.
- access modifier:
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
}
}
'Programming > Java' 카테고리의 다른 글
Java 시작하기 :: OOP(3) : 인터페이스를 사용한 추상화 (1) | 2019.09.26 |
---|---|
Java 시작하기 :: OOP(2): 클래스, 변수, 메서드 (0) | 2019.09.24 |
Java 시작하기 :: 자바 프로그래밍 기초(2) (0) | 2019.09.10 |
Java 시작하기 :: 자바 프로그래밍 기초 (0) | 2019.09.08 |
Java 시작하기 :: 자바란 무엇일까? (0) | 2019.09.04 |
Comments