ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA μžλ°” μ˜€λ²„λ‘œλ”©, this, final, static, varags
    JAVA 2020. 8. 4. 23:00

    🎯 μžλ°” μ˜€λ²„λ‘œλ”©, this, final, static ν‚€μ›Œλ“œ, νŒ¨ν‚€μ§€μ™€ μž„ν¬νŠΈ, varagsκ°€λ³€μΈμžλ₯Ό μ•Œμ•„λ³Έλ‹€.

     

     

     

     

    μ˜€λ²„λ‘œλ”©

    μ‹λ³„μžλŠ” λ˜‘κ°™μ€ 이름을 쀑볡 μ‚¬μš©ν•  수 μ—†λ‹€. ν•˜μ§€λ§Œ λ³€μˆ˜μ™€ λ‹€λ₯΄κ²Œ λ©”μ†Œλ“œμ™€ μƒμ„±μžλŠ” 같은 클래슀 λ‚΄μ—μ„œ 같은 μ΄λ¦„μœΌλ‘œ μ—¬λŸ¬κ°œλ₯Ό λ§Œλ“€ 수 있으며 μ΄λ ‡κ²Œ μƒμ„±λœ 것을 μ˜€λ²„λ‘œλ”©μ΄λΌκ³  λΆ€λ₯Έλ‹€. μ—¬λŸ¬κ°œμ˜ 인자λ₯Ό 받을 수 있게 μ€€λΉ„ν•œ λ’€ μžλ™μœΌλ‘œ νƒ€μž…μ— λ§žλŠ” μ• λ₯Ό μ•Œμ•„μ„œ ν˜ΈμΆœν•΄μ€€λ‹€. μ˜€λ²„λ‘œλ”© 생성 μ‹œ λ°˜λ“œμ‹œ 인자리슀트(μˆœμ„œ,νƒ€μž…,개수)κ°€ μ„œλ‘œ λ‹¬λΌμ•Όν•˜λ©° κΈ°λ³Έ μƒμ„±μžλŠ” λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.

     

    //μƒμ„±μž μ˜€λ²„λ‘œλ”©
    
    
    public class Ex05_15 {
    
      public Ex05_15() {
        System.out.println("()μƒμ„±μž 호좜");
      }
      public Ex05_15(String a) {
        System.out.println("(String a) μƒμ„±μž 호좜");
      }
      public Ex05_15(int a) {
        System.out.println("(int a) μƒμ„±μž 호좜");
      }
      public void sum() {
        System.out.println("()호좜");
      }
      public void sum(int a) {
        System.out.println("(int a)ν•¨μˆ˜ 호좜");
      }
      public void sum(String a) {
        System.out.println("(String a)ν•¨μˆ˜ 호좜");
      }
      public void sum(int a, String b) {}
      public void sum(String a, int b) {}
    
    
      public static void main(String[] args) {
        Ex05_15 test = new Ex05_15();
        Ex05_15 test1 = new Ex05_15("홍길동");
    		
        test.sum("홍길동");
        test.sum(100);
      }
    }

    λ™μΌν•œ μ΄λ¦„μ˜ μƒμ„±μžμ™€ λ©”μ„œλ“œκ°€ μ—¬λŸ¬κ°œ λ§Œλ“€μ–΄μ‘Œμ§€λ§Œ μΈμžλ¦¬μŠ€νŠΈλŠ” μ„œλ‘œ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ˜€λ²„λ‘œλ”©μœΌλ‘œ 생성됐닀. 리턴 νƒ€μž…μ€ 달라도 상관없닀. λ©”μ†Œλ“œλ₯Ό 맀번 μ„œλ‘œ λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ κ΄€λ¦¬ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ— μ˜€λ²„λ‘œλ”©μ„ ν™œμš©ν•˜λ©΄ μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆλ‹€.

     

     

    this ν‚€μ›Œλ“œ

    객체 μƒμ„±λœ μžκΈ°μžμ‹ μ˜ 객체λ₯Ό 가리킨닀. λ§Œλ“€μ–΄μ§„ 객체의 λ©€λ²„λ³€μˆ˜κ°€ 자기 μžμ‹ μ„ 가리킬 λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€. thisν‚€μ›Œλ“œλŠ” 일반적으둜 μƒλž΅λ˜μ§€λ§Œ λͺ…μ‹œν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. 

     

    1) μΈμŠ€ν„΄μŠ€λ³€μˆ˜λͺ…κ³Ό λ‘œμ»¬λ³€μˆ˜λͺ…이 λ™μΌν•œ 경우

    String name;
    public void setName(String name){
      this.name = name;
    }

     

    2) μ˜€λ²„λ‘œλ”© μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” 경우

    class Man{
    	String name;
    	int age;
    	
    	public Man(String name) {
    		this(name, 19);
    		System.out.println("Person μƒμ„±μž1");
    	}
    	
    	public Man(String name, int age) {
    		this.name = name;
    		this.age = age;
    		System.out.println("Person μƒμ„±μž2");
    	}
        
    	public String getName() {return name;}
    	public int getAge() {return age;}
    }
    
    
    public class Ex05_17 {
    
    	public static void main(String[] args) {
    		Man p = new Man("홍길동");
    		System.out.println(p.getName() + " " + p.getAge());
    	}
    
    }

     

     

    νŒ¨ν‚€μ§€μ™€ μž„ν¬νŠΈ

    νŒ¨ν‚€μ§€λŠ” ν΄λ”κ°œλ…μ΄λ‹€. 클래슀λ₯Ό κΈ°λŠ₯에 따라 νŒ¨ν‚€μ§€λ‘œ λΆ„λ₯˜ν•œλ‹€. νŒ¨ν‚€μ§€ 이름은 가급적 μ†Œλ¬Έμžλ‘œ μ‚¬μš©ν•˜κ³ , μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 이름을 지정해야 ν•œλ‹€. 클래슀 생성 μ‹œ νŒ¨ν‚€μ§€λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ default νŒ¨ν‚€μ§€μ— μƒμ„±λœλ‹€.

    νŒ¨ν‚€μ§€κ°€ μ„œλ‘œ λ‹€λ₯Έ ν΄λž˜μŠ€λΌλ¦¬λŠ” 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€. 이럴 λ•Œ import문을 μ‚¬μš©ν•œλ‹€.

     

    // com.yyy νŒ¨ν‚€μ§€ μ•ˆμ— 클래슀 λ§Œλ“€κΈ°
    
    package com.yyy;
    
    public class Student {
    	public String name="μ΄μˆœμ‹ ";
    }

    νŒ¨ν‚€μ§€λŠ” 클래슀 맨 μœ„μ— μ„ μ–Έλœλ‹€.

    //Test ν΄λž˜μŠ€μ— Student 클래슀 객체생성 //νŒ¨ν‚€μ§€ μ—†μŒ
    
    public class TestStudent {
    
    	public static void main(String[] args) {
    		//com.yyy.Student test = new com.yyy.Student(); //직접 경둜λ₯Ό 지정
    		Student test = new Student();
    		System.out.println(test.name);
    	}
    
    }

    객체 생성을 μœ„ν•΄ Student ν΄λž˜μŠ€μ— μ ‘κ·Όν•΄μ•Όν•˜μ§€λ§Œ νŒ¨ν‚€μ§€κ°€ μ„œλ‘œ λ‹¬λΌμ„œ μ ‘κ·Όν•  수 μ—†λ‹€. 직접 νŒ¨ν‚€μ§€μ˜ 경둜λ₯Ό μ§€μ •ν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법도 μžˆμ§€λ§Œ(//주석) 잘 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©° importλ₯Ό μ‚¬μš©ν•˜λŠ” 게 νŽΈν•˜λ‹€. 

     

    λΉ¨κ°„ 쀄에 마우슀λ₯Ό 올리면 importλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€

     

    이 방법은 Scannerλ₯Ό μ‚¬μš©ν•  λ•Œλ„ λ΄€λŠ”λ°, μŠ€μΊλ„ˆλ„ νŒ¨ν‚€μ§€λ₯Ό importν•˜λŠ” 방법이닀. importλŠ” μ—¬λŸ¬λ²ˆ ν•  수 μžˆλ‹€.

     

     

    static μŠ€νƒœν‹±

    μžλ°”λŠ” μ»΄νŒŒμΌν•  λ•Œ 제일 λ¨Όμ € 클래슀λ₯Ό λ‘œλ”©ν•˜λ©° static ν‚€μ›Œλ“œλ₯Ό 첫번째둜 ν™•μΈν•œλ‹€. static ν‚€μ›Œλ“œλŠ” 클래슀, λ³€μˆ˜, λ©”μ„œλ“œμ˜ μ§€μ •μžλ‘œ μ‚¬μš©ν•  수 있고 객체 생성 없이 μ‚¬μš©ν•  수 μžˆλ‹€.

    static λ©”μ†Œλ“œ μ•ˆμ—μ„œλŠ” λ©€λ²„λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. λ©€λ²„λ³€μˆ˜λŠ” λ©”μΈν•¨μˆ˜μ— newλ₯Ό μ‚¬μš©ν•΄ 객체생성 ν›„ μ‚¬μš©ν•  수 μžˆλŠ”λ° static은 mainν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κΈ°λ„ 전에 λ‘œλ”©λ˜κΈ° λ•Œλ¬Έμ— λ‘œμ»¬λ³€μˆ˜λ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

    μƒμ„±λœ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ 클래슀λͺ…μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€. ν΄λž˜μŠ€μ΄λ¦„.λ³€μˆ˜orν•¨μˆ˜μ΄λ¦„ μ΄λ ‡κ²Œ λ°”λ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.

     

    //static을 μ΄μš©ν•œ λ³€μˆ˜ μ‚¬μš©
    
    class Counter {
    
    	static int count;
    	int num;
    
    	public Counter() {
    		count++;
    		num = count;
    	}
    
    	public int getNum() {
    		return num;
    	}
    }
    
    public class Ex05_18 {
    
    	public static void main(String[] args) {
    
    		System.out.println("객체생성 횟수 : " + Counter.count);
    		Counter c = new Counter();
    		System.out.println("객체생성 횟수 : " + c.getNum());
    		Counter c2 = new Counter();
    		System.out.println("객체생성 횟수 : " + c2.getNum());
    		System.out.println("객체생성 횟수 : " + Counter.count);
    	}
    
    }

    static λ³€μˆ˜μ— count 횟수λ₯Ό λˆ„μ μ‹œμΌœ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.

    mainμ—μ„œλΆ€ν„° ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό 따라가본닀

     

    //static을 μ΄μš©ν•œ λ©”μ„œλ“œ μ‚¬μš©
    
    class Counter2{
    	static int count;
    	int num;
    	public Counter2() {
    		count++;
    		num = count;
    	}
    	public int getNum() {return num;}
    	public static int getCount() {return count;}
    }
    
    public class Ex05_19 {
    	public static void main(String[] args) {
    		System.out.println("객체생성 횟수 : "+ Counter2.getCount());
    		Counter2 c = new Counter2();
    		System.out.println("객체생성 횟수 : "+ c.getNum());
    		Counter2 c2 = new Counter2();
    		System.out.println("객체생성 횟수 : "+ Counter2.getCount());
    	}
    }

    static ν•¨μˆ˜ μ•ˆμ—μ„œ λ©€λ²„λ³€μˆ˜ μ‚¬μš©μ€ λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ static λ³€μˆ˜λŠ” μ‚¬μš©ν•  수 μžˆλ‹€. 

     

     

    싱글톀 λ””μžμΈ νŒ¨ν„΄

    객체 ν•œ 개λ₯Ό μ—¬λŸ¬λͺ…이 κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•  λ•Œ μ“°λŠ” 방법이닀. 객체λ₯Ό 계속 new 둜 λ”°λ‘œ μƒμ„±ν•˜μ§€ μ•Šκ³  ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œμ„ μƒμ„±ν•˜κΈ° μœ„ν•œ νŒ¨ν„΄μ΄λ‹€.

    public class Bank {
    	private static Bank b = new Bank(); //2.staticλ³€μˆ˜, private μ„ μ–Έ,
    	//λ‚΄λΆ€μ—μ„œ 객체생성
    	private Bank() {} //1. μƒμ„±μžλ₯Ό private 지정, λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ 객체생성 μ•ˆλ¨, newμ•ˆλ¨.
    	public static Bank getBank() {
    		return b; //3. μƒμ„±ν•œ 객체λ₯Ό 리턴(ν•„μš”ν•œ κ³³μ—μ„œ μ–»μ–΄μ„œ μ‚¬μš©)
    		//4. μ‚¬μš©ν•˜λŠ” κ³³μ—μ„œλŠ” Bank b=Bank.getBank()둜 μ–»μŒ. 같은 객체 μ‚¬μš©
    	}
    
    public String getName() {
    	return "xx은행";
    }

     

     

    final ν‚€μ›Œλ“œ

    public static final int NUM = 100;

    ν΄λž˜μŠ€μ— μ‚¬μš©ν•˜λ©΄ 상속이 λΆˆκ°€λŠ₯, λ©”μ†Œλ“œμ— μ‚¬μš©ν•˜λ©΄ μ˜€λ²„λΌμ΄λ”©μ΄ λΆˆκ°€λŠ₯ν•˜λ©°, λ³€μˆ˜μ— μ‚¬μš©ν•˜λ©΄ 값을 λ³€κ²½ν•  수 μ—†λ‹€λŠ” μ˜λ―Έμ΄λ‹€. 값을 λ³€κ²½ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μƒμˆ˜λ₯Ό ν‘œν˜„ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

     

     

    Varags(κ°€λ³€μΈμž)

    [μ§€μ •μž] λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œλͺ…( λ°μ΄ν„°ν˜• ... λ³€μˆ˜λͺ… ){}

    λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  땐 λ©”μ†Œλ“œλͺ…κ³Ό μΈμžλ¦¬μŠ€νŠΈκ°€ μΌμΉ˜ν•΄μ•Όν•˜λŠ”λ° Varags(...)λ₯Ό μ‚¬μš©ν•˜λ©΄ 인자 갯수 상관없이 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. λ©”μ†Œλ“œλͺ…이 κ°™μ•„μ•Όν•˜κ³  인자의 λ°μ΄ν„°νƒ€μž…μ΄ λͺ¨λ‘ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.

    public class TestMain2 {
    	//κ°€λ³€μΈμž, λ©€λ²„λ©”μ†Œλ“œ(ν•¨μˆ˜)
    	public void a(int ... n) {
    		for(int x:n) {
    			System.out.println(x);
    		}
    	}
    	public void c(String ... n) {
    		for(String x:n) {
    			System.out.println(x);
    		}
    	}
    	
    	public static void b() {System.out.println("static λ©”μ†Œλ“œ");}
    	// static λ©”μ†Œλ“œ
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		TestMain m = new TestMain();
    		m.a(10);
    		m.a(10,20);
    		m.a(10,9,8);
    		m.a(1,2,3,4,5);
    		m.a(1,2,3,4,5,6);
    		m.c("홍길동", "μ΄μˆœμ‹ ");
    		b(); //static λ©”μ†Œλ“œ, 객체생성 없이 μ‚¬μš©
    	}
    
    }

     

     

     

    😜 NEXT : μžλ°” 상속과 λ‹€ν˜•μ„± κ³΅λΆ€ν•˜κΈ°

    λ°˜μ‘ν˜•

    λŒ“κΈ€

κ°œλ°œκ³΅λΆ€