728x90

객체 = 인스턴스 = 클래스변수(잘 사용 안함)  //  객체를 가장 많이 쓴다.

- 오버로딩 (중목 메서드)
  같은 클래스내에 메서드 이름이 같은 메서드가 여러개 존재할때
  이때 구분은 매개변수(인수, 인자)로 한다.   매개변수 순서가 바뀌어도 자료형이 틀려서 구분 가능하면 OK
------------------------------------------------------
Overloading 예제
------------------------------------------------------
class Test_7
{
 public int sum(int a, int b)
 {
  System.out.println("sum(int a, int b)...");
  int s= a+b;
  return s;
 }
 public float sum(float a, float b)
 {
  System.out.println("sum(float a, float b)...");
  float s = a+b;
  return s;
 }
 public double sum( double a, double b)
 {
  System.out.println("sum(double a, double b)...");
  double s = a+b;
  return s;
 }
}// end Test_7

class Method_7
{
 public static void main(String args[])
 {
  Test_7 A = new Test_7();
  int a1 = A.sum(1,2);
  float a2 = A.sum(1.3f, 1.3f);
  double a3A.sum(1.34d,1.345d);  
 }//end main
}//endl Test_7
-----------------------------------------------------------------
예제 (매개변수로 배열을 넘기는 경우)
-----------------------------------------------------------------
class Test_9
{
 public void aa(int ar[], int y) // a = ar
 {
  for(int i = 0; i<ar.length; i++)
  {
   ar[i]+=y;
  }
 } 
}
class Method_9
{
 public static void main(String args[])
 {
  int a[] = {10,20,30};
  
  Test_9 A = new Test_9();
  A.aa(a,10);  //인자값으로  배열(a)와 10 을  넘긴다.
  
  disp(a);  // static메소드안에서는 static메소드만 호출이 가능하다. 
 }
 
 public static void disp(int a[])  //   static 빠지면 컴파일 에러!
 {
  for(int i = 0; i<a.length; i++)
  {
   System.out.print(a[i]+"  ");
  }
 }
}
----------------------------------------------------------------------
- this  ( 자신의 객체를 가리킨다.)
----------------------------------------------------------------------
class Sinsang{
 //맴버변수 = 필드선언
 String name;
 int age;
 double ki;
 
 public void setData(String name , int age, double ki)
 {
  this.name            =              name;
 //자신의 객체 name        매개변수에서 넘어온 name
  this.age= age;
  this.ki =  ki;
 }
 public String getName(){
  return name;
 }
 public void disp(){
  System.out.println("이름 :" + name);
  System.out.println("나이 :" + age);
  System.out.println("키 :" + ki);
 }
}

class Method_10
{
 public static void main(String args[])
 {
  Sinsang A = new Sinsang();
  A.setData("유승호", 19, 180.3);
  A.disp();
  
  System.out.println();
  
  System.out.println("이름 : "+ A.getName());
  
  System.out.println();
  
  A.setData("이민정", 26, 160.3);
  A.disp();
  
  System.out.println();
  
  A.setData("신세경",19,163.3);
  A.disp();
  
 }//main

}//class
-----------------------------------------------------------------

- static 변수, 매서드

 static메서드는 static으로 선언된 변수,메서드만 호출 할 수 있다.
 static메서드는 객체 생성 하지 않고도 호출 할 수 있다.
 클래스명.메서드(); 
 클래스이름.맴버변수;
 static 변수는 모든 객체가 공유한다.

 main함수가 static으로 선언된 이유.
  -  main함수는 JVM이 객체 생성 없이 바로 호출해야 하기 때문이다.
----------------------------------------------------------------
 예제  (static메서드는 객체 생성 하지 않고도 호출 할 수 있다. )
----------------------------------------------------------------
class Test_1{
 public static int su = 100;
 
 public static void kk(){
  System.out.println("kk()  call.....");
  su+=100;
 }
}

class StaticMethod_1
{
 public static void main(String args[]){
  System.out.println(Test_1.su);// static 맴버 번수 출력(객체 생성 전)
  
  Test_1.kk(); //static 매서드 호출
  
  System.out.println(Test_1.su);// static 맴버 변수 출력(객체 생성 후)
  
  Test_1 A = new Test_1();
  System.out.println(A.su);
  A.kk();
  System.out.println(A.su);

 }//end main
}//end StaticMethod_1
----------------------------------------------------------------------
예제1 (static메서드는 static으로 선언된 변수,메서드만 호출 할 수 있다.)
----------------------------------------------------------------------

class StaticMethod_2
{
 int a = 100; 
 static int b = 200;
 
 public static void main(String args[]){
  //System.out.println(a);// Error!!!  static메서드는 static변수만 참조가능
  System.out.println(b);
  
  // aa(); // Error!!!  static메서드는 static 메서드만 호출 가능
  bb();
 }
 public void aa(){
  System.out.println("aa() call");
 }
 public static void bb(){
  System.out.println("bb() call");
 }
}
----------------------------------------------------------------------
예제2 (static메서드는 static으로 선언된 변수,메서드만 호출 할 수 있다.)
----------------------------------------------------------------------
/*
자신의 클래스 내의 메서드 호출
다른 클래스 내의 메서드 호출
 */
class Btest
{
 void b(){
  System.out.println("bbb");
 }
}
class Atest
{
 public static void main(String args[]){
  
  //a();   //Error!!  static 메서드는 static 메서드만 호출 가능
  Atest A = new Atest();
  A.a();  // 이경우에는 객체를 생성했기 때문에 가능.
  
  Btest B = new Btest();
  B.b();
 }
 void a(){
  System.out.println("aaa");
 }
}

-------------------------------------------------------------
static (정상적인 활용)
-------------------------------------------------------------
class Singsang{
 String name;
 int age;
 static int sungin = 20; // 미성년자 판정 나이는 결정되어 있으므로 변할 필요가 없고 공유되도 상관없다.
 
 public void setData(String name, int age){
  this.name = name;
  this.age = age;
 }
 public void disp(){
  String temp;
  if(age>=sungin){
   temp= "성인";
  }else{
   temp = "미성년자";
  }
  System.out.println( name + " 님은 "+ age + "살이고 " +  temp);
 }
}

class StaticMethod_3
{
 public static void main(String args[]){
  Singsang kim = new Singsang();
  Singsang lee = new Singsang();
  Singsang park = new Singsang();
  
  kim.setData("kim",18);
  lee.setData("lee",21);
  park.setData("park",22);
  
  kim.disp();
  lee.disp();
  park.disp();
  
 }//end main

}
----------------------------------------------------
static ( 잘못된 예제)
 ---------------------------------------------------
class Sangpum{
 String pum;
 int su;
 static int dan; // dan에다가 계속 단가를 덥어씌운다. 그래서 마지막 단가(딸기) 로 몽땅 출력됨. 
 public void setData(String pum, int su, int dan){
  this.pum=pum;
  this.su=su;
  this.dan=dan;
 }
 public void disp(){
  System.out.println(pum + "~~~" +su+ "~~~" + dan);
 }
}

class StaticMethod_4{
 public static void main(String args[]){
  Sangpum A = new Sangpum();
  Sangpum B = new Sangpum();
  Sangpum C = new Sangpum();
  
  A.setData("사과",3,2000);
  B.setData("감",10,300);
  C.setData("딸기",2,2500);
  
  A.disp();
  B.disp();
  C.disp();
 }
}

 - 생성자
  1. 클래스명과 같은 이름을 기재
  2. 리턴형이 없다.
  3. 필드 초기화 (목적)
  4. 인수를 갖는다 (오버로딩 가능)
  5. 객체 싱성시 자동호출

 *사용자가 생성자를 새로 정의하면 default생성자는 생성이 안된다.  이럴 경우 습관적으로 default 생성자를 만들어줘야함.
 
  생성자를 안쓰면 defalut 생성자를 호출한다. ( default생성성자는 아무 기능 없음.)
  사용자가 생성자를 만들면 default 생성자는 없어진다.

  this()     자신의 클래스 생성자 호출
  super()  상위 클래스 생성자 호출
  this       자신의 객체 가리킴
  super    상위 객체 가리킴( 상속관계일때)

   * static 메서드 에서는 this 사용못함 (왜냐면 자신이 2번 호출 되니까)
     
static 변수 , static메서드는 클래스랑 같이 메모리(정적메모리) 에 할당되어있다.
     같이 할당되어있기 때문에 this를 사용하면 자신을 2번 지칭하기 때문에..

int a = 100; // 전역변수나 static변수나 마찬가지로 메모리에 프로그램이 끝날때까지 할당되어있다.

class ConstTest_1
{
   public static void main(String args[])
      {
         this.a = 100; error!!!
       }
}

 예제 (생성자 Overloading)
----------------------------------------------------------------------------
class Cons
{
 public Cons()//default 생성자
 {
  System.out.println("Cons()");
 }
 public Cons(int a)
 {
  System.out.println("Cons(int a)");
 }
 public Cons(String name, int age)
 {
  System.out.println("Cons(String name, int age)");
 }
}

class ConTest_1
{
 public static void main(String args[])
 {
   new Cons();   //객체 생성, 생성자는 자동 호출
  new Cons(100);
  new Cons("김씨",200);

 }
}
--------------------------------------------------------

+ Recent posts