JAVA공부중
항상 변수의 값을 복사해서 대입
항상 변수의 값을 복사해서 대입
// 기본형 메소드
public class MethodChange1 {
public static void main(String[] args) {
int a = 10;
System.out.println("메서드 호출 전: a = " + a); // 10
changePrimitive(a);
System.out.println("메서드 호출 후: a = " + a); // 10
}
static void changePrimitive(int x) {
x = 20;
}
}
메서드 호출 후가 10인 이유는 메서드에 기본형타입 a값을 대입만 해줬지 a값이 바뀐 것은 아니기때문.
public class MethodChange2 {
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
System.out.println("메서드 호출 전: dataA.value = " + dataA.value);
changeReference(dataA);
System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
}
static void changeReference(Data dataX) {
dataX.value = 20;
}
}
데이터(필드)와 기능(메서드)이 분리되어 유지보수에 어려운 절차 지향 프로그래밍을 개선하고자한 프로그래밍.
클래스에 데이터와 기능을 모아 관리 -> 유지보수 good
상위 계층의 본인을 가르킴. 생성자에서 사용 시 this는 인스턴스 자신의 참조값을 가르킴.
같은 이름을 가지고, 매개변수가 다른 생성자를 만드는 것을 오버로딩한다 함.
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this(name, age, 50); //변경. 생성자 코드의 첫줄에만 작성 가능
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
속성과 기능을 외부로부터 숨기기 위해 사용.
package access.a;
public class AccessData {
public int publicField;
int defaultField;
private int privateField;
public void publicMethod() {
System.out.println("publicMethod 호출 "+ publicField);
}
void defaultMethod() {
System.out.println("defaultMethod 호출 " + defaultField);
}
private void privateMethod() {
System.out.println("privateMethod 호출 " + privateField);
}
public void innerAccess() {
System.out.println("내부 호출");
publicField = 100;
defaultField = 200;
privateField = 300;
publicMethod();
defaultMethod();
privateMethod();
}
}
package access.b;
import access.a.AccessData;
public class AccessOuterMain {
public static void main(String[] args) {
AccessData data = new AccessData(); //public 호출 가능
data.publicField = 1;
data.publicMethod(); //다른 패키지 default 호출 불가 //data.defaultField = 2;
//data.defaultMethod();
//private 호출 불가
//data.privateField = 3;
//data.privateMethod();
data.innerAccess();
}
}
package access.a;
public class PublicClass {
public static void main(String[] args) {
PublicClass publicClass = new PublicClass();
DefaultClass1 class1 = new DefaultClass1();
DefaultClass2 class2 = new DefaultClass2();
}
}
class DefaultClass1 {
}
class DefaultClass2 {
}
package access.a;
public class PublicClassInnerMain {
public static void main(String[] args) {
PublicClass publicClass = new PublicClass();
DefaultClass1 class1 = new DefaultClass1();
DefaultClass2 class2 = new DefaultClass2();
}
}

static 을 붙이는 변수와 메서드는 객체의 변수와 메서드가 아닌 클래스의 변수와 메서드가 된다. 접근 제어자만 허락하면 클래스를 통해 호출할 수 있음.
static이 붙었느냐 안붙었느냐에 따라 필드의 이름이 달라짐.
static이 붙었느냐 안붙었느냐에 따라 메서드 이름이 달라짐.
변수에 final이 붙으면 값을 변경할 수 없음. (마치 자바스크립트의 const 와 같음.)
final은 변수, 클래스, 메소드를 포함한 여러 곳에 붙을 수 있음.
변수는 무조건 최초 한번만 할당이 가능한데 기본형의 경우 값을 넣어주기때문에 상수로도 사용된다. 하지만 참조형의 경우 참조값(주소값)이 고정이기 때문에 참조형 내부의 값들은 변경이 가능하다.
상수로 쓰이는 경우 대문자로 사용하며, 언더바(언더스코어)를 이용해서 띄어쓰기를 표시한다.(public static final double PI = 3.14; 처럼)
변수를 공용상수로 사용하지 않을때는 고객의 id와 같이 변하면 안되는걸 final처리하여 사용한다.