접근제어자
private
- 접근금지 ( method는 상속 안 되며 method overriding 금지 ) 자기 자신 접근 가능
public
- 접근허용 ( 다른 폴더에 있는 클래스는 접근하기 위해서는 public 선언이 필요하다 )
default
- 같은 패키지일 때 접근허용, 다른 패키지일 때 접근금지 상속관계인 경우라도 접근금지
protected
- 같은 패키지일 때 접근허용, 다른 패키지일 때 접근금지 상속관계인 경우 허용
기타제어자
final
- 위치 : 클래스 앞(상속금지), 메서드 앞(overriding 금지), 변수 앞(재할당 금지)
abstract
- 위치 : 클래스 앞, 메서드 앞 의미 : 추상적이라는 의미
static
- 위치 : 멤버변수 적용가능 static 변수; 의미 : 클래스에 속한 것이란 의미
- 위치 : method 적용가능 static 메서드(); 의미 : 메서드는 static 선언된 것만 호출가능 하다
- 상속관계가 성립되더라도 static은 그 값은 변화가 없다
클래스 앞에 선언이 되는 접근제어자 : public, default 그 외의 접근제어자는 변수에 사용
public > protected > default > private
#static static은 객체생성 전에 메모리에 할당된다
위치 : 멤버변수, method 적용가능 의미 : 클래스에 속한 것이란 의미
class A{
public static void main(String[] args){
System.out.println(Math.PI);
}
}
클래스 변수(static이 선언된 멤버변수) : 모든 객체가 공유하는 변수
객체변수(static이 선언되지 않은 멤버변수) : 객체에 속한 변수
class A{
static int a=100; // 클래스변수
int b=200; // 객체변수
A(){ a++; b++; }
}
class B{
public static void main(String[] args){
A o1=new A();
System.out.println(A.a); // 101 클래스 변수의 형태를 보더라도 객체 생성한 변수는 통합적으로 적용된다
System.out.println(o1.b); // 201
A o2=new A();
System.out.println(A.a); // 102
System.out.println(o2.b); // 201
A o3=new A();
System.out.println(A.a); // 103
System.out.println(o3.b); // 201
}
}
#static 블록 : 클래스가 로드될 때 자동으로 호출되는 메서드
class A{
static{ System.out.println(1);} // static이 선언되어 있으면 자동으로 호출이 된다 그래서
} // 변수나 메서드 앞에 선언되어있다면 그 변수와 메서드가 자동 호출된다
//static{ 실행문 } // 그래서 static 블록안에 선언문과 호출문은 자동으로 호출된다
class B{ // static{실행문}은 실행문 안에 static선언 했던 것들만 사용 할 수 있다
static{ System.out.println(2); }
public static void main(String... args){
System.out.println(3);
}
instance 블록 – 시그니쳐는 {}만으로 실행가능하다 {}안에 실행문이 자동으로 실행한다
class A{
{ //<-- instance 블록 - 원하지 않아도 자동으로 실행되기때문에
System.out.print("객체생성되기전에반드시"); //작업의 유연성이 떨어지므로 비추천
System.out.println("실행해야하는소스코드");
for(int a=1; a<=10; a++)
System.out.print(a+" ");
} //<-- instance 블록
A(){
System.out.println("AAA");
}
A(int n){
System.out.println("BBB");
}
A(String s){
System.out.println("CCC");
}
}
class B{
public static void main(String... args){
A o1=new A();
A o2=new A(100);
A o3=new A("abc");
}
}
private 선언된 생성자를 객체생성 하기
class A{
private A(){}
static A abc(){ return new A(); } // method def를 호출하기 위해서 클래스 A의 객체생성이 필요하다 하지만
void def(){ System.out.println(1); } // 생성자 A가 private 선언되어 있어 객체생성 접근이 불가능하다. 하지만
} // method abc() 실행문에 return new A()를 활용한다면 객체생성을 할 수 있다
class B{
public static void main(String[] args){
// 반환형인 abc()는 static이 선언되어있어 객체생성 없이 클래스 이름으로 호출이
// 가능하다는 이점을 활용하자 abc() 참조형 A이므로 호출문 작성하면
//이 된다. 이때 A.abc()=new A() return 값이 저장되기에
A o=A.abc(); A o=A.abc(); // 식을 풀이하면 객체생성 때와 같은 식이 성립된다
o.def(); A o=new A()
}
( 객체 생성할 수 없는 클래스 객체생성 활용 예문 )
java.util.Calendar클래스의 getInstance method 호출하는 소스코드 ( 객체 생성할 수 없는 클래스 객체생성 하기 )
Calendar클래스는 어떠한 이유로 객체생성이 되지 않는다
import java.util.Calendar;
class A{
public static void main(String[] args){
Calendar o=Calendar.getInstance(); //getInstance()는 반환형으로 return 값이 Calendar이다
} //그래서 달력정보를 호출하려면 getInstance()를 꼭 사용하여야 한다
}
// java.util.Calendar클래스의 클래스변수
// YEAR, MONTH, DATE의 값을 출력하는 소스코드
import java.util.Calendar;
class A{
public static void main(String[] args){
System.out.println(Calendar.YEAR); // 1 YEAR, MONTH, DATE static이 선언된 클래스 변수이다
System.out.println(Calendar.MONTH); // 2
System.out.println(Calendar.DATE); // 5
}
}
java.util.Calendar클래스의 get메서드 호출하는 소스코드
import java.util.Calendar;
class A{
public static void main(String[] args){
Calendar o=Calendar.getInstance(); //옆 예문에서 private 선언된 생성자를 객체 생성하는 방법과
int y=o.get(Calendar.YEAR); //유사한 방법으로 활용할 수 있다
int m=o.get(Calendar.MONTH)+1;
int d=o.get(Calendar.DATE);
System.out.println(y);
System.out.println(m);
System.out.println(d);
}
}
static 활용 예문이다
class Child{
String name;
static int candyNum;
Child(String n){ name=n; candyNum=10;}
void eatCandy(){ candyNum--;
}
class A{
public static void main(String[] args){
Child c1=new Child("진우");
Child c2=new Child("서진");
System.out.println(c1.name);
System.out.println(c2.name);
System.out.println(c1.candyNum); // 10
System.out.println(c2.candyNum); // 10
c1.eatCandy(); // 진우(이)가 사탕을 먹는다 사탕수:9
c1.eatCandy(); // 진우(이)가 사탕을 먹는다 사탕수:8
c2.eatCandy(); // 서진(이)가 사탕을 먹는다 사탕수:9
System.out.println(c1.candyNum); // 7
//가독성을 위해서 Child.candyNum로 고쳐주는 것이 좋다.
System.out.println(c2.candyNum); // 7
//그 이유는 static을 선언하여 공용으로 사용하는 의미를 내포하고 있다.
}
}
class A{
static int a=100;
int b=200;
void c(){
System.out.println(a);
System.out.println(b);
}
static void d(){
System.out.println(a); //static 간에 호출 가능
System.out.println(b); //컴파일에러
}
}
class B{
public static void main(String[] args){
A.d();
A o=new A();
}
}
# final
위치 : 마지막이라는 의미
의미 : 클래스 앞(상속금지), 메서드 앞(overriding 금지), 변수 앞(재할당 금지)
final 클래스 앞에 선언될 때 예문
final class A{ //final은 class에서 상속할 것이 없을 때 확장(상속) 금지를 선언할 때 사용한다
static int a=100; //옆에 예문처럼 static만 선언되어있다면 상속할 필요가 없으므로
static int b(){ return 200; } //final을 선언해서 상속하는 것을 막아야 한다
} //static은 공용처럼 사용할 수 있으며 어떤 변수가 초기화하거나 재할당하게 되면
class B extends A{ 그 값은 독자적인 값으로 여러 객체생성을 하면 그 값은 한 개의 값으로 선언된다
void c(){
System.out.println(a);
}
}
class C{
public static void main(String args[]){
B o1=new B(); o1.a=300; = A.a=300; //가독성을 위해 변경해야한다
B o2=new B(); o2.c();
}
}
//final 변수 앞에 선언될 때 예문
class A{
final int num;
A(int n){
num=n; //생성자에서 로컬변수의 최초 재할당은 가능하다.
num=300; // 컴파일에러
}
void a(){
num=400; // 컴파일에러
}
}
interface A{ //자동으로 접근제어자 선언됨
void abc();
} //interface를 선언하게되면 그 클래스 해당하는 메서드는 static final void abc();라는 형식이
//숨겨져 있다 그래서 범위가 정해지고 public > protected > default > private
class B implements A{
public void abc(){ //앞에는 public을 꼭 선언해야 오버라이딩을 할 수 있다
} //그리고 interface를 선언하게되면 개체생성을 하지 못하고 구현개체를 개별로 선언해주고
} //부모상족자로 interface 클래스를 선언하여 interface가 가지고있는 메서드를 구현 개체에
//오버라이딩을 해서 그 구현하게된다
다음은 다항적 변수와 abstract을 활용하는 방법을 알아보자
2020/06/14 - [Java/Java 입문] - [Java] 상속자, 은닉변수, super(), this의 활용
'IT_Web > Java' 카테고리의 다른 글
Java 엑셀 데이터 읽어오기 및 다중 insert 한방에 하기 (1) | 2022.08.05 |
---|---|
[Java] 다형적변수, final, abstract, 형변환 활용 (0) | 2020.06.20 |
[Java] 상속자, 은닉변수, super(), this의 활용 (0) | 2020.06.14 |
[java] 객체모델링(멤버변수, 매개변수, 로컬변수)활용 및 메서드 (0) | 2020.06.13 |
[Java] 메서드 선언과 호출, 반환형과 무반환형 method 활용 (0) | 2020.06.11 |