-
day18_1- JAVA (자바 ,static 메서드, 인스턴스메서드, 메서드 오버로딩, 생성자, this)KIC/JAVA 2021. 7. 15. 23:02반응형
스태틱과 인스턴스의 차이
-> 스태틱은 변수 선언 시에 메모리 할당
-> 인스턴스는 new로 객체화 할때 메모리 할당
-> 즉 스태틱의 메모리 할당 시점이 더 빠르다는 것이 기억할 점
[static 메서드(클래스 메서드)]
-> static 메서드로 표현 가능. static이 붙어있으면 클래스 메서드, 붙어있지 않으면 인스턴스 메서드이다.
-> static 메서드는 변수의 선언이 될 때 바로 생성이 된다. new 연산자를 생성하지 않아도 바로 불러 쓸 수 있다.
-> static 메서드는 durtl static 변수 처럼 객체를 생성하지 않고도 '클래스이름.메서드이름' 와 같은 식으로 호출이 가능
-> 메서드 내에서 인스턴스 변수를 사용하지 않거나, 클래스(static) 변수만 사용하는 메서드들은 static 메서드로 정의하는 것이 좋다. 반대로 인스턴스만 사용할 땐 인스턴스 메서드로 선언하는 것이 좋다.
-> 인스턴스 변수를 사용하지 않는다는 조건으로 static 메서드를 사용할 수 있다.
-> staitc 멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스 를 생성해 주소를 달아서 써야 한다.
(인스턴스 멤버(인스턴스 변수와 인스턴스 메서드)는 반드시 객체가 생성한 후에만 참조 또는 호출이 가능하기 때문)
-> static 멤버에서 인스턴스 멤버를 가져다 쓰는 것은 불가능 (멤버는 변수 + 메서드라는 뜻)
-> 인스턴스 멤버는 메모리 할당되는 시점에서 이미 static 멤버가 있기 때문에 가져다 쓰기 가능
[인스턴스메서드]
-> new 연산자를 생성해야 불러 쓸 수 있다. 객체화를 해야하는 메서드
-> 인스턴스 메서드는 인스턴수 변수와 관련된 작업을 하는, 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드 이다.
-> 인스턴스 메서드를 선언한 시점에선 이미 static 메모리들은 다 잡힌 상태라 사용이 가능
-> 인스턴스 변수 뿐만 아니라 인스턴스 메서드를 호출 하는 경우에도 인스턴스 메서드로 선언되어야 한다.
package javaPro.java_modifier.java_member; public class MemberCallEx1 { static int cv1 = 10; static int cv2 = cv1; // 클래스 멤버간 호출 int iv1 = 100; int iv2 = iv1; // 인스턴출멤버간 호출 int iv3 = cv1; // 인스턴스멤버에서 클래스 멤버 호출 //static int cv3 = iv1; // 클래스 멤버에서 인스턴스 멤버 호출 -> 객체화 필요 static int cv3 = new MemberCallEx1().iv1; // 클래스 멤버에서 인스턴스 멤버 호출 -> 객체화 필요 public static void main(String[] args) { //cv2 = iv1; // 클래스 멤버인 main 메서드에서 iv1 인스턴스 멤버 접근 불가 cv2 = new MemberCallEx1().iv1; // iv1 = cv2; new MemberCallEx1().iv1 = cv2; // method1(); //error new MemberCallEx1().method1(); method2(); }//2 void method1() { System.out.println(cv1 + cv2); System.out.println(iv1 + iv2); } static void method2() { System.out.println(cv1 + cv2); // System.out.println(iv1 + iv2); MemberCallEx1 m = new MemberCallEx1(); System.out.println(m.iv1 + m.iv2); } }
[메서드 오버로딩]
-> 메서드는 서로 구별해야하기 때문에 각각 다른 이름을 가져야 하는게 원칙이지만, 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의할 수 있게 하는 것
[오버로딩의 조건]
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 매개변수는 같고 리턴 타입이 다른 경우는 오버로딩이 성립되지 않는다.
(리턴 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)
[오버로딩의 예]
-> println 메서드를 호출할 때 매개변수로 넘겨주는 값의 타입에 따라 아래의 오버로딩된 메서드들 중의 하나가 선택되어 실행되는 것이다.
-> 보기 1, 2 는 오버로딩 x
-> 보기 3, 4 는 오버로딩 o
[생성자]
-> 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
-> 인스턴스 변수 초기화 작업, 인스턴스 생성시 실행되어야 할 작업을 위해 사용
-> 생성자도 메서드 처럼 클래스 내에 선언
-> 구조는 리턴값이 없는 메서드 형태 (생성자는 void도 적지 않는다.)
-> 생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드라고 생각할 것
(몇가지 특징만 제외하면 메서드와 동일하다.)
-> 생성자를 생성하지 않으면 컴파일러가 기본 생성자를 자동으로 생성해줌
-> 만약 사용자가 생성자를 하나라도 만들면 기본 생성자는 자동으로 만들어 주지 않는다.
-> 생성자도 오버로딩이 가능하므로 여러개 생성 가능
-> 오버로딩 조건에 맞춰 매개변수의 개수 또는 타입이 달라야 함
-> 인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 활용하는 것이 코드를 보다 간결하고 직관적으로 만든다.(생성자의 사용 이유)
아래 방법보다 위의 생성자를 활용한 방법이 더 간결
[생성자의 조건]
-> 생성자의 이름은 클래스의 이름과 같이야 함
-> 생성자는 리턴 값이 없음
[생성자에서 다른 생성자 호출 - this]
-> 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자도 this를 통해 가능
[조건]
-> 생성자의 이름으로 클래스이름 대신 this를 사용
-> 한 생성자에서 다른 생성자를 호출할 때에는 반드시 첫 줄에서만 호출이 가능
[this]
-> this - 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장
-> this(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출 할때 사용(위의 this가 이것)
-> this를 사용할 수 있는 것은 인스턴스 멤버뿐 staitc 메서드에서는 인스턴스 멤버들을 사용할 수 없는 것처럼 this도 사용 불가능 (static 메서드가 호출된 시점에서 인스턴스가 존재하지 않을 수도 있기 때문)
package javaPro.java_modifier.java_member; class Parent { int x; Parent(int x){ // 기본 생성자가 아닌 개발자가 따로 구현한 생성자 this.x = x; } //Parent(){} // 4. 이걸 구현했다면 밑에서 굳이 생성자를 다시 만들 필요는 없다. } class Child extends Parent{ int y; // 1. 이 생성자는 지울 수 없다. -> 생성자의 생략은 default 생성자만 가능하기 때문 // 2. Child가 Parent 생성자를 상속 받았지만 //Parent 에게는 default 생성자가 없어서 생략하면 에러가 난다. //3. 결론은 Parent에 defalut 생성자가 없다면 Child에서도 따로 생성자를 만들어 줘야 한다. public Child(){ super(10);//super(10)을 만든 생성자의 가장 첫줄에 써야하는 것이 문법 } } public class SuperEx { public static void main(String[] args) { Child c = new Child(); System.out.println(c.x); // Child가 Parent에게 상속받은 있던 변수 x } }
300x250'KIC > JAVA' 카테고리의 다른 글
day19 - JAVA (자바 , 상속, super, Object 클래스, 오버라이딩, 다형성, 추상 클래스, pakage/import) (0) 2021.07.16 day18_2- JAVA (자바 , 변수의 초기화, toString) (0) 2021.07.15 day17- JAVA (자바 ,객체지향언어, 변수, 클래스변수, 인스턴스변수, 메서드, 매개 변수) (0) 2021.07.15 day16 - JAVA (자바 예제) (0) 2021.07.14 day15 - JAVA (배열, 다차원 배열, 향상된 for문, 가변 배열) (0) 2021.07.14