객체 = 인스턴스 = 클래스변수(잘 사용 안함) // 객체를 가장 많이 쓴다.
- 오버로딩 (중목 메서드)
같은 클래스내에 메서드 이름이 같은 메서드가 여러개 존재할때
이때 구분은 매개변수(인수, 인자)로 한다. 매개변수 순서가 바뀌어도 자료형이 틀려서 구분 가능하면 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);
}
}
--------------------------------------------------------