클래스 (Class)
sample.java
class Animal{
}
public class Sample {
public static void main(String[] args){
}
}
보통 Class는 특별한 경우가 아니라면 파일 단위로 하나씩 작성한다.
즉 위의 경우에 Animal 클래스는 Animal.java 파일에 단독으로 작성하는 것이 일반적인 방법이다.
위 Animal 클래스는 가장 간단한 형태의 클래스이다.
클래스의 declared만 있고 내용이 없는 껍데기 뿐인 클래스이다.
하지만 이 껍데기뿐인 클래스도 아주 중요한 기능을 가지고 있다.
그 기능은 바로 객체(object)를 만드는 기능이다.
객체는 다음과 같이 만들 수 있다.
class Animal{
}
public class TestClass{
public static void main(String []args) {
Animal cat = new Animal();
}
}
new 는 객체를 생성할 때 사용하는 keyword이다.
이렇게 하면 Animal 클래스의 instance인 cat, 즉 Animal 객체가 만들어진다.
객체와 인스턴스
클레스에 의해서 만들어진 객체를 instance라고도 한다.
그렇다면 객체와 인스턴스와의 차이는 무엇일까?
Animal cat = new Animal() 이렇게 만들어진 cat은 객체이다.
그리고 cat이라는 객체는 Animal의 instance이다.
instance라는 말은 특정 객체(cat)가 어떤 클래스(Animal)의 객체인지를 관계 위주로 설명할 때 사용된다.
즉, "cat은 인스턴스" 보다는 "cat은 객체" 라는 표현이 어울리며,
"cat은 Animal의 객체" 보다는 "cat은 Animal의 인스턴스" 라는 표현이 잘 어울린다.(관계)
- 과자틀 → 클래스(Class)
- 과자틀에 의해서 만들어진 과자들 → 객체(Object)
- 과자A와 과자틀과의 관계 → 인스턴스(Instance)
즉, 다음과 같이 무수히 많은 동물 객체(cat, dog, horse, ...) 들을 Animail 클래스를 통해 만들 수 있다.
Animal cat = new Animal();
Animal dog = new Animal();
Animal horse = new Animal();
...
객체 변수 (Instance variable)
class Animal{
String name; // String 타입 name 변수 추가
}
public class TestClass{
public static void main(String []args) {
Animal cat = new Animal();
}
}
Animal 클래스에 name 이라는 String 변수를 추가
- 클래스에 선언된 변수
- 객체 변수
- 인스턴스 변수
- 멤버 변수
- 속성
: 클래스에 의해 생성되는 것은 객체, 그리고 그 클래스에 선언된 변수는 객체 변수
객체 변수는 변수이므로 값을 대입할 수 있다.
대입하기 전에 객체 변수는 현재 어떤 값을 가지고 있는지 먼저 출력해보자.
객체 변수를 출려갛려면 객체 변수에 어떻게 접근 해야 하는지를 알아야 한다.
객체 변수는 다음과 같이 도트연산자( . )를 이용하여 접근할 수 있다.
객체.객체변수
즉, Animal cat = new Animal() 처럼 cat이라는 객체를 생성했다면
이 cat 객체의 변수 name에는 다음과 같이 접근할 수 있다.
cat.name // 객체: cat, 객체변수: name
이제 객체 변수에 어떤 값이 대입되어 있는지 다음과 같이 출력해 보자.
class Animal{
String name; // String 타입 name 변수 추가
}
public class TestClass{
public static void main(String []args) {
Animal cat = new Animal();
System.out.println(cat.name); // null
}
}
cat.name을 출력한 결과로 null 이 나왔다.
null은 값이 할당되어 있지 않은 상태를 말한다.
객체 변수로 name을 선언했지만 아무런 값도 대입을 하지 않았기 때문에 null 이라는 값이 출력된 것이다.
메서드 (Method)
다른 프로그래밍 언어에는 함수라는 것이 별도로 존재한다.
하지만 java는 클래스를 떠나 존재하는 것은 있을 수 없기 때문에 자바의 함수는 따로 존재하지 않고
클래스 내부에 존재한다.
자바는 이러한 클래스 내부의 함수를 메서드라고 부른다.
: 보통 함수와 메서드가 공존하는 언어(예: 파이썬)에서는 두 개를 구분하여 말하기도 하지만
자바는 메서드와 함수를 구분하여 말하지 않는다. 자바에서 사용되는 함수의 정확한 명칭은 메서드이다.
- 간단한 메서드의 예
: sum 메서드에 3, 4 라는 입력값을 전달하여 7이라는 값을 return 받는 예제이다.
public class TestClass{
// Method (Parameter) 매개변수
int sum(int a, int b) {
return a + b;
}
public static void main(String []args) {
int a = 3;
int b = 4;
TestClass calculator = new TestClass();
// 호출시 사용되는 Arguments(인자 혹은 인수)
int c = calculator.sum(a, b);
System.out.println(c); // 7
}
}
이렇게 객체변수에 접근하는 방법과 (접근 연산자 . 를 통해)
현재 값이 할당되어 있지 않은 상태에 대해서 (null 값 반환) 에 대해 알게 되었다.
이제 객체 변수에 값을 대입하는 방법에 대해서 알아보자.
클래스에는 객체 변수와 더불어 메서드(Method)라는 것이 있다.
메서드는 클래스 내에 구현된 함수를 의미하는데 보통 함수라고 말하지 않고 메서드라고 말한다.
이제 메서드를 이용하여 Animal 클래스의 객체 변수인 name에 값을 대입해 보자.
class Animal{
String name; // 멤버 변수 추가
public void setName(String name) { // 메서드 추가
this.name = name;
}
}
Animal 클래스에 추가된 setName 메서드는 다음과 같은 형태의 메서드이다.
- 입력: String name
- 출력: void (return 값 없음)
즉, 입력으로 name이라는 문자열을 받고 출력은 없는 형태의 메서이다.
이번에는 setName 메서드의 내부를 살펴본다. setName 메서드는 다음의 문장을 가지고 있다.
this.name = name;
이 문장에서 this에 대해서 이해하는 것은 꽤 중요하다.
일단은 우선 이 메서드를 호출하는 방법에 대해 먼저 알아본다.
즉, 우리가 만든 setName 메서드를 호출하려면 다음과 같이 호출해야 한다.
class Animal{
String name; // 멤버 변수
// 멤버 변수에 값을 대입하는 기능의 메서드
public void setName(String name) {
this.name = name;
}
}
public class TestClass{
public static void main(String []args) {
Animal cat = new Animal();
cat.setName("body"); // 메서드 호출
System.out.println(cat.name); // body
}
}
이로서 cat.name 은 이제 null 이 아니라 "body"임을 확인할 수 있다.
class Animal{
String name; // 멤버 변수
// 멤버 변수에 값을 대입하는 기능의 메서드
public void setName(String name) {
this.name = name;
}
}
public class TestClass{
public static void main(String []args) {
Animal cat = new Animal();
cat.setName("body"); // 메서드 호출
Animal dog = new Animal();
dog.setName("happy");
/* 객체 변수는 공유되지 않는다. */
System.out.println(cat.name); // body
System.out.println(dog.name); // happy
}
}
- 메서드의 구조
: 메서드는 입출력 유무에 따라 다음과 같이 4가지로 분류할 수 있다.
- 입력과 출력이 모두 있는 메서드
- 입력과 출력이 모두 없는 메서드
- 입력은 없고 출력은 있는 메서드
- 입력은 있고 출력은 없는 메서드
public class TestClass{
// 1. 입력과 출력이 모두 있는 메서드
int sum(int a, int b) {
return a + b;
}
// 2. 입력 값은 없고 출력은 있는 메서드
String say() {
return "Hi";
}
// 3. 리턴값이 없는 메서드
void total(int a, int b) {
System.out.println(a +"과"+b+"의 합은"+(a+b)+"입니다.");
}
// 4. 입력값도 리턴값도 없는 메서드
void talk() {
System.out.println("Hello");
}
return 의 또 다른 쓰임새
특별한 경우에 메서드를 빠져나가고 싶다면 return 을 단독으로 사용하여 메서드를 즉시 빠져나갈 수 있다.
public class TestClass{
void sayNick(String nick) {
if ("fool".equals(nick)) {
return;
}
System.out.println("My nick is " + nick);
}
public static void main(String []args) {
TestClass sample = new TestClass();
sample.sayNick("angel"); // My nick is angel
sample.sayNick("fool"); // 조건문에 해당되어 제어block 탈출
}
}
return 문만 단독으로 사용하여 메서드를 빠져나가는 이 방법은 return 자료형이 void 메서드에만 해당된다.
리턴 자료형이 명시되어 있는 메서드에서 return 문만 작성하면 compile Error가 발생한다.
메서드 내에서 선언된 변수의 효력 범위
메서드 안에서 사용하는 변수의 이름을 메서드 밖에서 사용한 이름과 동일하게 사용한다면 어떻게 될까?
public class TestClass{
// parameter 'a'는 메서드내 지역변수이기 때문에 다른 영역에 영향을 끼치지 않는다.
void varTest(int a) {
a++;
}
public static void main(String []args) {
int a = 1;
TestClass sample = new TestClass();
sample.varTest(a);
System.out.println(a); // 1
}
}
'Language > Java' 카테고리의 다른 글
Java - Inheritance (0) | 2023.03.26 |
---|---|
Java - Call by value (0) | 2023.03.25 |
Java - Object Oriented Programming (0) | 2023.03.25 |
Java - 제어문(conditional, iteration) (0) | 2023.03.25 |
Java - Set (0) | 2023.03.25 |