첫번째 STATIC.JAVA
package e_oop;
public class Static {
/*
* static 을 붙이면 프로그램 실행시 메모리에 올라간다. ( 객체생성을 해주지 않아도 메모리에 올라간다.
* static이붙어서 )
* 객체생성을 하지 않아도 사용할 수 있다.
* static 을 붙인 변수는 개체간에 변수의 값을 공유한다. -> 다 똑같은 값을 가지게 된다.
* static 이 붙은 맴버의 명칭 : 클래스변수, 클래스메소드
* static 이 붙지 않은 멤버의 명칭 : 인스턴스 변수, 인스턴스 메서드
*
*
*
*/
static int var ;
// 변수에 static을 붙이는 이유는 값을 공유하기 위해.
//method에 static 을 붙이는 경우는 - > 객체생성을 하지 않고 사용하기 위해.
public static void main(String[] args) {
// TODO Auto-generated method stub
Human 철수 = new Human();
Human 영희 = new Human();
//Human 이라는 클래스에 있는 애들을 사용할 수 있는 변수 이름이 철수, 영희
철수.saveMoney(100000) ;
영희.saveMoney(200000) ;
// 100000 200000 안에는 꼭 숫자만 써야한다. , 쓰면 문자가 되는군.
철수.saveDateMoney(200000);
영희.saveDateMoney(200000);
//앞으로 입력받을때 이거를 사용하면 된다.
System.out.println("문자열 입력>");
String str = ScanUtil.nextLine();
System.out.println(str);
System.out.println("숫자 입력>");
int num = ScanUtil.nextInt();
System.out.println(num);
}
}
class Human{
int account ;
void saveMoney(int money){
account += money;
System.out.println("통장잔고 : " + account ) ;
}
static int dateAcccount ;
//철수와 영희가 공유를 하기 때문에 static
int dateAccount;
void saveDateMoney(int money){
dateAccount += money ;
System.out.println("데이트 통장 잔고 :" + dateAccount);
}
두번째 ScanUtill.java
package e_oop;
import java.util.Scanner;
public class ScanUtil {
// 유틸리티성향 : 어떤기능을 좀더 편하게 사용할 수 있게 하는 메서드
private static Scanner s = new Scanner (System.in);
// 유틸리티 성향의 메서드인 경우 static 을 붙인다. --> 객체생성을 하지 않고 사용하기 위해
public static String nextLine(){
return s.nextLine();
}
public static int nextInt(){
//유틸성향
//Math.random();
//Math.round(a); //static 이 다 붙어 있는 메소드
return Integer.parseInt(s.nextLine());
}
//int를 입력받을때는 이렇게 사용하면 됨
//--> static class로 가서 입력했음 글자랑 숫자랑
//객체 = 인스턴스라고도 한다.
// new Scanner(System.in).nextLine();
//ScanUtill.nextLine();
//두개의 차이점 잘 보기 . 위에는 인스턴스 메소드인거고 아래는 클래스 메소드 인거다.
}
세번째 VariableInin
package e_oop;
public class VariableInit {
//명시적초기화, 생성자, 3가지가 있다.
//명시적 초기화
int var = 10;
static int staticVar = 20 ;
//초기화 블럭
{
var = 30 ;
}
//static 이 붙은 애를 초기화블럭하려면 static 안에서
static{
staticVar = 40 ;
}
// 명시적 초기화를 하면 값만 넣을수있지만 초기화 블럭을 사용하면 여러줄을 사용할 수 있다.
/* 생성자
-클래스와 같은 이름의 메서드 //괄호가 붙은거 무조건 메소드
-인스턴스 변수를 초기화하기 위해 사용한다. (static 이 붙지않은 인스턴스 변수 )
-클래스에 생성자는 반드시 하나 이상 존재해야 한다.
- 직접 선언해주지 않으면 컴파일러가 기본 생성자(아무내용도 없는 생성자 )를 만들어준다.
- 생성자는 리턴타입이 없다.
*
*/
//생성자는 리턴타입이 없다. 이름은 클래스이름과 같은 것
// VariableInit(){
//
// }
//---> 요게 생성자
//
VariableInit(){
var = 50 ;
//클래스 변수도 초기화를 할수는 있다.
//staticVar = 60 ; //하면 좋진 않다. -> 값을 공유해야 하는 클래스 변수가 객체 생성 시마다 계속 초기화되기
//때문에 클래스 변수를 생성자에서 초기화하는 것은 좋지 않다.
//똑같은 값을 계속유지하고있었는데 -> 기존에 유지하고 있던 값이 초기화로 인해서 바뀔수가 있는것.
//생성자 사용 이유
//초기화에 여러줄의 코드가 필요할때
// 초기화에 파라미터가 필요할 때
//VariableInit() 얘는 매소드니까 ()안에 파라미터를 받을 수 있어
//why ? 왜 파라미터를 받아서 초기화를 해야할까 ?
}
public static void main(String[] args) {
Init i = new Init();
i.a = 10 ;
i.b = 20;
i.c = 30;
Init i2 = new Init(); //7번 연결//컴파일러가 생기는 이유 : 생성자를 하나 만들면 이 생성자는 존재하지 않기 때문에.
i2.a = 40;
i2.b = 50;
i2.c = 60 ;
//불편한 일 --ㅣ> 밑에다가 생성자를 만드는일 *---------
//객체를 생성을 또한번 해준다.
Init i3 = new Init(70,80,90);
//바로 위에서는 초기화를 해주려면 여러줄을 써줘야 하는데 아래보면 class Init 를 보면 좀 더 간단하게
//선언을 해줄 수 가 있다.(?)
}
}
class Init {
int a ;
int b ;
int c ;
//----------------*
Init(int a, int b, int c ) {
this.a = a;
this.b = b;
this.c = c;
//this : 인스턴스 변수와 지역변수의 이름이 같을 때 둘을 구분하기 위해 사용한다. 인스턴스앞에 this를 붙임
//그냥 사용하면 지역변수가 우선해서 this를 붙이지않으면 지역변수가 됨. (? )
//THIS 는 이름이 똑같을때 사용하는것.
}
//오버로딩 : 같은 이름의 메서드를 여러개 정의하는 것
//컴파일에러 없애기 위해서 생성자를 만든다 파라미터가 없는 생성자 7번 연결
Init() { //얘를 만들어주니까 위에 컴파일에러가 사라진다.
this(10,20,30);
/*a = 10;
b = 20;
c = 30;*/
// this () : 생성자에서 다른 생성자를 호출할 때 사용한다.
//생성자에서 다른 생성자를 부를때는 이름을 사용하는 것이 아니라 this 를 사용
//생성자를 호출해주는 this는 반드시 첫줄에서만 사용을 해야한다. ->
// 만약 this가 첫줄에서 사용이 안되면
//
/* a = 10;
b = 20;
c = 30;
this(10,20,30); // this 가 10, 20, 30 으로 값을 초기화해줬는데 그럼 위에 있던 a, b, c 는 의미가
없는 애가 되기 때문에 */
//똑같은 이름을 가진 메서드를 만들 수 있는데 파라미터로 구분을 한다. 파라미터가 다르면 구분이된다 .
}
}
네번째 ClassMaker2
package e_oop;
public class ClassMaker2 {
//인스턴스변수 하나를 선언하고 명시적으로 초기화 해주세요.
int su = 40 ;
//위에서 선언한 인스턴스변수를 초기화 블럭을 사용해 초기화 해주세요.
{ su = 20;
}
//위에서 선언한 인스턴스변수를 생성자의 파라미터를 사용해 초기화
//생성자는 클래스이름과 동일한 이 이름을 가진 메소드
ClassMaker2(int su){
this.su = su;
//안에있는 su가 보통은 위에 값이랑 같은 이름으로 만든다.
//얘가 받은 su 가 ( 받은거로 ) 위에 있는 인스턴스변수 su를 초기화하는것
}
//위에서 선언한 인스턴스변수를 생성자를 하나 더 만들어서 초기화 해주기.
ClassMaker2(){
this(89) ;
/* or
su = 89*/
//파리미터로 구분 : 개수가다르거나 타입이 달라야한다 파라미터가.
/*순서 : 가장기본값인 0 으로 초기화 -> 명시적초기화 40 으로 -> 초기화블록으로 20 ->
마지막으로 생성자실행되고 89로 초기화*/
//초기화 순서 : 명시적 초기화 -> 초기화 블럭 -> 생성자
}
}
}
댓글
댓글 쓰기