필드
객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳으로 변수와 비슷하나 필드를 변수라고 부르지 않는다.
변수와 필드의 차이점
변수 : 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸된다.
필드 : 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.
: 클래스 중괄호 {} 블록 어디서든 존재할 수 있으나 생성자와 메소드 중괄호 {} 블록 내부에서는
선언될 수 없다.
★필드와 지역 변수의 차이점을 잘 정리해놓은 사이트★
https://rorobong.tistory.com/118
생성자
new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
(참고로 생성자 말고 필드에서도 초기화가 가능하다.)
클래스 이름으로 되어 있고 리턴 타입이 없다.
new 연산자에 의해 생성자가 성공적으로 실행되면 힙 영역에 객체가 생성되고 객체의 번지가 리턴된다.
리턴된 객체의 번지는 클래스 변수에 저장된다.
기본 생성자
아래와 같이 컴파일러가 자동으로 추가하는 중괄호 {} 블록 내용이 비어 있는 것을 말한다.
public 클래스명(){ }
클래스가 public class로 선언되면 기본 생성자에서도 public이 붙지만
클래스가 public 없이 class로만 선언되면 기본 생성자에도 public이 붙지 않는다.
public class Test {
}
public class TestEx {
public static void main(String[] args) {
Test test = new Test();
}
}
위에서 말했다싶이 컴파일러가 public Test(){ }라는 기본 생성자를 자동으로 추가해주기 때문에
위의 코드는 에러가 발생하지 않는다. 하지만 아래의 코드를 보자.
public class Test {
Test(String str, int x){
}
}
public class TestEx {
public static void main(String[] args) {
// Test test = new Test();
Test test2 = new Test("문자열",10);
}
}
기본 생성자 대신 우리가 생성자를 명시적으로 선언한다면
기본 생성자가 자동으로 호출되지 않으므로 에러가 발생한다.
따라서 우리가 생성자를 명시적으로 선언한다면 기본 생성자를 직접 만들어줘야하는 것을 볼 수 있다.
생성자에서 필드 초기화 : this.
public class Test {
String nation = "한국";
String name;
public Test(String n) {
name=n;
}
}
package practice.chap06;
public class TestEx {
public static void main(String[] args) {
Test test = new Test("코린이");
System.out.println("name : " + test.name);
}
}
// 결과
name : 코린이
위의 코드에서 Test 생성자의 매개 변수 이름은 n을 사용했는데 매개 변수의 이름이 너무 짧으면
코드의 가독성이 좋지 않기 때문에 필드의 이름과 비슷하거나 동일한 이름을 사용하는 것이 좋다.
하지만 동일한 이름을 사용하면 우리가 원했던 결과가 출력되지 않는 것을 볼 수 있다. 아래의 코드를 보자.
public class Test {
String nation = "한국";
String name;
public Test(String name) {
name=name;
}
}
// 결과
name : null
우리가 원했던 결과인 name : 코린이가 아니라 name : null이 나오는 것을 볼 수 있다.
이는 =를 기준으로 왼쪽은 필드, 오른쪽은 매개변수를 의미하고 싶었지만
결과적으로는 어느 쪽이 필드 또는 매개변수인지 알 수 없었기 때문에
name이 코린이가 아닌 String 초기 값인 null이 출력된 것이다. 그러면 어떻게 해결할 수 있을까?
앞에 this.를 붙이면 된다. 여기서 this는 객체가 객체 자신을 가르키는 것을 말한다.
public class Test {
String nation = "한국";
String name;
public Test(String name) {
this.name = name;
}
}
// 결과
name : 코린이
이렇게 .this를 붙이면 우리가 원하던 결과인 name : 코린이 출력된다.
메소드
객체의 동작에 해당하는 중괄호 {} 블록을 말하며 리턴 값이 있을 수도 있고 없을 수도 있다.
만약에 리턴 값이 있다면 리턴 타입이 선언부에 명시되어 있어야 한다.
그리고 메소드에서 매개 변수가 필요한 경우가 있고 필요 없는 경우가 있다.
그렇다면 만약에 정해진 숫자가 아닌 규칙없이 무작위로 100개의 숫자를 더하는 것처럼
매개 변수의 개수를 모른다면 어떻게 해야할까? 아래의 코드를 보자.
public class Computer {
int sum1(int[] values) {
int sum=0;
for(int i=0; i<values.length; i++) {
sum+=values[i];
}
return sum;
}
int sum2(int ... values) {
int sum=0;
for(int i=0; i<values.length; i++) {
sum+=values[i];
}
return sum;
}
}
public class ComputerEx {
public static void main(String[] args) {
Computer com = new Computer();
int[] values = {1,2,3};
int result = com.sum1(values);
System.out.println(result);
int result2 = com.sum1(new int[] {4,5,6});
System.out.println(result2);
int result3 = com.sum2(10,10,10);
System.out.println(result3);
int result4 = com.sum2(10,10,10,10,10);
System.out.println(result4);
}
}
// 결과
6
15
30
50
sum1()과 같이 매개 변수를 배열 타입으로 선언할 수 있다.
하지만 매개 변수를 배열 타입으로 선언하면 메소드를 호출하기 전에 배열을 생성해야하는 불편한 점이 있다.
그래서 배열을 생성하지 않고 값의 목록만 넘겨주는 방법이 있다.
sum2() 메소드의 매개 변수를 ...을 사용해서 선언하게 되면
메소드 호출 시 넘겨준 값의 수에 따라 자동으로 배열이 생성되고 매개 값으로 사용된다.
'국비 지원 > JAVA' 카테고리의 다른 글
[JAVA] 날짜 클래스(SimpleDateFormat와 Calendar) (0) | 2023.05.07 |
---|---|
[JAVA] 오버로딩과 this() (0) | 2023.05.06 |
[JAVA] 멤버변수, 지역변수, 전역변수 (0) | 2023.05.06 |
[JAVA] 배열 생성 new 연산자 (0) | 2023.05.03 |
[JAVA] 문자열 비교하기 : ==와 equals() (0) | 2023.05.02 |