변수의 범위
- 변수가 선언된 블럭이 변수의 사용범위이다
- 블럭 바깥에 존재하는 매개변수도 메서드 선언부분에 포함되기 때문에 블럭 안에서 사용이 가능하다
ex)
public class ValableScopeExam{
int globalScope = 10; // 인스턴스 변수
public void scopeTest(int value){
int localScope = 10;
System.out.println(globalScope);
System.out.println(localScpe);
System.out.println(value);
}
}
위 코드에서는 오류가 나지 않는다.
클래스의 속성으로 선언된 변수인 globalScope(클래스의 속성으로 선언된 변수는 클래스 전체에서 사용이 가능하다)
메소드 선언부 매개변수인 value,
메소드에 선언된 localScope 모두 사용이 가능하다.
** 그러나 globalScope는 같은 클래스 안에 있는 main메소드에서 사용이 불가능하다
public static void main(String[] args) {
System.out.println(globalScope); //오류
System.out.println(localScope); //오류
System.out.println(value); //오류
}
왜냐하면 main함수는 static한 메소드이기 때문이다!
*static한 변수가 아니면 사용이 불가능하다*
public class VariableScopeExam {
int globalScope = 10;
static int staticVal = 7;
public void scopeTest(int value){
int localScope = 20;
}
public static void main(String[] args) {
System.out.println(staticVal); //사용가능
}
}
여기서 static한 변수란?
- 정적변수
- 메모리에 올라갈 때 딱 한번 메모리 공간에 할당됨
- 그 값은 모든 인스턴스가 공유
그러면 main메소드에서 static한 변수말고는 사용이 불가능할까 ?
아니다 !
인스턴스화를 통해 가능하다 !
ValableScopeExam v1 = new ValableScopeExam();
ValableScopeExam v2 = new ValableScopeExam();
v1.golbalScope = 20;
v2.golbalScope = 30;
System.out.println(v1.golbalScope); //20 이 출력된다.
System.out.println(v2.golbalScope); //30이 출력된다.
v1.staticVal = 10;
v2.staticVal = 20;
System.out.println(v1.statVal); //20 이 출력된다.
System.out.println(v2.statVal); //20 이 출력된다.
(메인 메소드안에서 작성되어야하는 코드임)
이렇듯 인스턴스화를 통해 non-static변수들을 출력할 수 있다.
여기서 하나의 의문점
맨 아래 코드 두줄을 살펴보자
System.out.println(v1.statVal); //20 이 출력된다.
System.out.println(v2.statVal); //20 이 출력된다.
10과 20이 출력될 것이라는 예상과 달리 둘다 20이 출력된다.
그 이유는 아까 위에서 static변수의 특징에 대해 언급했듯이
한번 메모리에 할당되고(공간이 하나라는 뜻) 그 값을 공유하기 때문이다.
이런 변수를 클래스변수라고 부른다
클래스 변수는 클래스 이름을 직접 사용하는 것이 가능하다
ex) System.out.println(VariableScopeExam.staticVal);
eum(열거형)
- enumerated type
- 서로 연관된 상수들의 집합
왜 enum을 사용할까 ?
public class EnumExam {
public static final String MALE = "MALE";
public static final String FEMALE = "FEMALE";
public static void main(String[] args) {
String gender1;
gender1 = EnumExam.MALE;
gender1 = EnumExam.FEMALE;
gender1 = "boy"
Gender gender2;
gender2 = Gender.MALE;
gender2 = Gender.FEMALE;
gender2 = "boy"; //오류를 발생시킨다
}
}
enum Gender{
MALE, FEMALE;
}
> gender가 MALE, FEMALE. 오직 두 개의 값만 가질 수 있게 하고 싶지만 enum을 사용하지 않게 되면
gender1 = "boy"같은 상수 취급이 가능해져서 의도와 달라질 수 있음.
하지만 enum을 사용하게 되면 내가 원하는 값만 가질 수 있도록 확정지을 수 있다.
필드(Field)
- 클래스를 정의할때 클래스의 속성을 저장하기 위해 선언하는 변수들
종류
- 지역변수 > 메소드 안에 선언된 변수
- 인스턴스변수 > 메소드 밖에서 static키워드 없이 선언된 변수. 객체가 생성될 때 생성됨
- 클래스변수(static) > 메소드 밖에서 선언된 변수 중 static 키워드를 사용하여 선언한 변수
생성자란?
- 모든 클래스는 인스턴스화 될때 생성자를 사용한다
- 매개변수가 없는 생성자를 기본생성자라고 한다
- 생성자를 만들지 않았을 때 컴파일시, 자동으로 기본생성자가 만들어진다
생성자의 역할
- 객체가 될 때 필드를 초기화
ex) 1
public class EX1 {
public EX1(){
System.out.println("생성자");
}
public static void main(String[] args) {
EX1 ex = new EX1(); // 인스턴스 생성 및 생성자 호출
}
}
//오류가 없는 코드이다
생성자와 인스턴스 모두 매개변수가 없기 때문에 오류가 나지 않는다
ex) 2
public class EX2 {
public EX2(String s){
System.out.println(s+"생성자");
}
public static void main(String[] args) {
EX2 ex2 = new EX2("나는");
// 인스턴스 생성 및 생성자 호출. 매개변수를 받으므로 오류가 나지 않는다
EX3 ex3 = new EX3();
// 생성자가 매개변수를 받지만 인스턴스가 매개변수를 갖지 않으므로 오류가 발생한다
}
}
- ex2번의 코드 중 ex3의 오류를 해결하기 위해 매개변수를 받지 않는 생성자를 하나 만들어주면 문제가 해결되는데, 이를 메소드 오버로딩이라고 한다. 오버로딩은 다음 시간에 더 자세히 배워보도록 하겠다.
본 게시글은 프로그래머스<자바입문>의 내용을 복습하며 정리한 글입니다.
'JAVA' 카테고리의 다른 글
JAVA(2022.05.09)- interface의 default메소드 (0) | 2022.05.09 |
---|---|
JAVA(2022.05.08)-클래스 형변환 , interface (0) | 2022.05.08 |
JAVA(2022.05.07)-추상클래스, super와 부모생성자, 오버라이딩 (0) | 2022.05.07 |
JAVA(2022.05.04)- class,String클래스,field, 메소드 (0) | 2022.05.04 |
JAVA(2022.5.3) do-while문, for,배열, for each문 (0) | 2022.05.03 |