1. Static Methods의 목적
1) 생성자 없이 사용 할 수 있다.
public class StaticDemo {
public static void main(String[] args){
Demo[] d = new Demo[5];
for (int i = 0; i < d.length; i++) {
d[i] = new Demo();
}
System.out.println(d[0].su);
System.out.println(d[0].num);
}
}
class Demo{
int su;
static int num;
public Demo(){
su++;
num++;
}
}
|
Static 변수인 num만 증가하고 su는 따로 객체를 만들기 때문에 5개의 1이 생긴다. |
2. Static Initializers (스태틱변수 초기화)
1) 스테틱 메모리 접근.
public class StaticDemo1 {
private static int su = method(); //static 멤버가 가장 먼저 메모리에 올리오기 때문에 main() 보다 method()가 먼저올라온다.
public static void main(String[] args){
System.out.println(su);
}
private static int method(){
System.out.println("i'm method");
return 1000;
}
}
|
2) 맴버변수는 생성자가 초기화 / 스태틱변수는 스태틱 블록이 초기화 한다.
public class StaticDemo2 {
private int su;
private static int num;
public StaticDemo2(){
System.out.println("나는 생성자");
su=10;
}
public static void main(String[] args) {
System.out.println("나는 메인");
}
static{
System.out.println("나는 스태틱 초기화 블록");
num = 100;
}
}
|
가장 먼저 스태틱 초기화블록이 실행되고 메인이 실행된다. 스태틱 초기화블록은 최초 한번 실행되고 |
3. Final
1) Final 상수 역시 생성자에서 초기화 할 수 있다.
2) Final Methods
4. Deprecation
1) java가 버전업 되면서 수정되거나 업데이트 된 클래스나 메소드를 호출 할 때 표시된다.
2) ex : Date => Calander
5. Inner Classes
1) Nested Class (Static class, 중첩클래스)
- why : static class 를 사용해 패키징화 하기 위해 사용한다. (new 로 생성 할 필요없이 접근 가능)
- 생성방법 : Outer.Inner in = new Outer.Inner();
- 제한사항 : Outer의 member변수, member 메소드는 사용할 수 없다. (생성한 후 사용 가능)
public class NestedClassDemo {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner(); // Outer를 생성하지 않아도 static인 Inner에 접근가능.
in.method1();
}
}
class Outer{
private int a;
public int b;
public Outer(){ //outer class constructor
this.a = 5; this.b = 10;
}
public static void method(){ //outer class method
System.out.println("나는 스태틱");
}
static class Inner{
private int c;
public int d;
public Inner(){
this.c = 5;
this.d = 10;
}
public void method1(){
Outer out = new Outer();
System.out.println("a ="+out.a); //static은 멤버에 접근 불가능. 주소를 가져야 하기때문에 생성자 필요
method(); //static은 static에 바로 접근이 가능하다.
}
public static void method2(){}
}
}
|
2) Member Class
- why : 다중 상속을 하기위해 사용한다.
- 생성방법 : Outer.Inner in = 바깥주소.new Inner();
- 제한사항 : Inner는 static 변수, static 메소드를 가질 수 없다.
public class MemberClassDemo {
public static void main(String[] args) {
Outer1 out = new Outer1();
Outer1.Inner1 in = out.new Inner1();
}
}
class Outer1{
private int a = 5;
private static int b= 10;
class Inner1{
private int c = 100;
// public static int d =4; //static 변수 사용 할 수 없다.
public void method(){
System.out.println("a="+a);
System.out.println("b="+b);
}
}
}
|
3) Local Class
- why :
- 생성방법 :
- 제한사항 : 메소드 속에서는 절차적이기 때문에 순서가있다. / public, private,protected 접근자 사용불가 / static 사용 불가 / 로컬클래스가 속해있는 메소드의 지역변수를 사용할 수 없다( 지역 상수는 사용 가능하다)
public class LocalClassDemo {
public static void main(String[] args) {
Outer2 out = new Outer2();
out.method();
}
}
class Outer2{
private int a= 5;
private static int b = 10;
public void method(){
int c = 100; //메소드의 지역변수
final int c2 = 100; //지역 상수
class Inner2{
private int d = 100;
public Inner2(){
System.out.println("나는 생성자");
}
public void display(){
System.out.println(a+b+d);
// System.out.println(c); // 사용 불가
System.out.println(c2); //사용가능
}
}
Inner2 in = new Inner2(); // method() 내에서는 순차적으로 처리된다.(Inner2를 알고있어야 생성가능)
in.display();
}
}
|
4) Anonymous Class
- why : 상속 관계가 아니어도 Overriding 할 수 있다.
- 생성방법 :
- 제한사항 :
public class AnonymousClassDemo {
public static void main(String[] args) {
Super s = new Super(){
public void display(){
System.out.println("hello22");
}
};
s.display();
}
}
class Super{
public void display(){
System.out.println("hello");
}
}
|
6. Enum
1) 고정된 갯수의 나열을 갖는 데이터를 갖는다.
2) 데이터 형이 없다.
3) 선언될 상수가 가장 윗줄에 작성되어야 한다.
4) 생성자는 public을 사용 할 수 없다.
public class EnumDemo {
public static void main(String[] args) {
for (Subjects s : Subjects.values()) {
System.out.print(s+"-->");
System.out.print(s.ordinal()+"==>"); //나열순서 출력
System.out.print(s.get()+"==>");
System.out.println(getInfo(s));
}
}
static String getInfo(Subjects s){
String info = null;
switch(s){
case JAVA : info ="열정" ; break;
case JDBC : info ="Oracle" ; break;
case JSP : info ="Javascript" ; break;
case Android : info ="SmartPhone" ; break;
case Project : info ="Idea" ; break;
}
return info;
}
}
|
public enum Subjects {
JAVA(1), JDBC(10), JSP(100), Android(1000), Project(10000);
Subjects(int v){ //생성자는 public 사용 안됨.
this.v = v;
}
private final int v;
public int get(){
return this.v;
}
} |