정적인 자식 Static

|

정적멤버 Static

정적 멤버란?

인스턴트 멤버와 달리 클래스에 고정된 필드, 메서드

클래스에 고정되어 메소드 영역에 저장되기 때문에 객체를 만들지 않고 클래스에 도트연산자(.)로 접근해 사용한다,

선언 방법은 별다를꺼 없다 고정된 이라는 뜻의 static을 필드, 메소드 앞에 붙여주면된다. 

예)

static int x;

static void x(){...}

객체 내부에 존재하는게 아니기때문에 모든 객체에 있는것도아니고 사용할때도 new 연산자로 객체를 만들지 않고 

클래스명.정적멤버명();<< 이런방식으로 사용한다.

물론 객체를 만든 뒤 참조변수로 참조 하는것도 가능은 하지만 하지말것.

딱히 할 필요가없다.(내가 모르는걸수도 있다.)

그럼 인스턴스 멤버와 비교해 어떨때 써야하는가. 

필드의 경우 

객체마다 가지고 있어야 하는 데이터 = 인스턴스 

모두가 사용하는 공용 데이터 = 정적멤버

예)

class 계산기

String color;

static double pi=3.14159....

와 같이 계산기(객체)는 저마다 다른 색깔을 가질수도있다. 

하지만 그 안의 PI계산식은?? 달라질수없다 모든 계산기의 파이는 3.14니까


메소드의경우

메소드의 경우는 더 간단하다 필드가 인스턴스일 경우 인스턴스로 

필드가 정적멤버일 경우 정적메소드로 선언한다. 

이유는 정적 멤버의 경우 클래스의 메소드 영역에 저장된다. 인스턴스는 객체내부에 존재한다. 

그렇기때문에 인스턴스는 객체를 생성해야만 사용이가능하다. 객체를 생성하지않고 사용할수있는 정적멤버는 인스턴스멤버를 사용할 수 없다.(사용할수 있는 방법은 있다.)

이러한 이유로 this. 역시 정적멤버에는 사용하지 못한다. this. 는 객체 자신을 가르키는것이기 때문이다.


정적 초기화   

정적멤버의 초기화/초기값의 설정을 위해서는 물론 필드를 생성할때 바로 값을 줄수도 있지만

초기화블록을 만들어서 초기화하는것이 가능하다. 

인스턴스멤버의 경우 생성자로 초기화 하는 것이 가능하지만 위에서 말했다 싶이 정적 멤버는 객체 내부에 존재하는게 아니기 때문에 생성자가 아니라 초기화 블록을 따로 만들어 준다. 

초기화 블록은 클래스가 메소드 영역을 로딩할때 자동으로 실행된다. 

\예)

static{.........}<<이거다.

class 클래스명{

static int x;

static{

x=10;

}

}

이런 방식으로 초기화블록을 사용한다. 예로 든것은 그냥 간단히 초기화 했지만 초기화 블록 내부에는 for,if문등 여러가지 복잡한 연산이 가능하다. 그렇기 때문에 초기화 값으로 복잡한 연산을 진행한 후의 값을 넣어주는것이 가능.

초기화 블록에서 하는일은 정적 필드의 초기화. 정적 메소드의 호출.

초기화 블록은 클래스내부에 여러개있어도 되고 실행될때는 순서대로 실행된다. 

초기화 블록 사용시 주의 사항

초기화 블록은 객체 없이도 사용이 가능하기 때문에 인스턴스 멤버의 사용이 불가능하다. 같은 이유로 this.의 사용도 안된다.

초기화 블록에서 인스턴스멤버를 사용하고 싶다면 먼저 블록안에서 객체를 생성하고 사용하면된다. 

이제 static이 뭔지 알게 되었다. 그럼 생각나는게 없는가 

ㅇㅇ 없다 나도 가르켜줘서 알았다. 

main()메소드는 어떻게 생겼더라>>

public static void main(String[] args){/....}

소오다 메인 메소드는 정적이노 멤바였던 거시다 오오오 스게에;;;;

그래서 같은 클래스밑에 인스턴스 멤버를 생성하고 사용하고 싶어도 메인에서는 객체 생성없이는 사용불가다. 즉

예) public class Car{

int speed;

void run(){////}


public static void main(String[] args){

speed =60;

run();

}

}

이 코드는 사용할 수 없다. 사용하고 싶으면 같은 클래스에 존재하더라도 객체를 생성하고 사용해야한다. 


싱글 (Singletion)

싱글톤은 무엇인가... 바로 나를 말한다. ...하아.....

그게아니라 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야할때가 있다고 한다. (나는 쥐뿔 몰라서 그런경우가 있나 잘 모른다. )

이때 단 하나만 생성된다고 해서 싱글톤이다. 

싱글톤을 만들려면 외부에서 new연산자로 생성자를 호출할수 없도록 막아야한다. (나는 안막아도 불러주는 외부가 없다...... 난 new연산자같은거없어도 호출할수있다.)

생성자를 호출한 만큼 객체가 생성되기 때문이다.   선언 방법은 간단하다 생성자 앞에 private를 붙여준다. \

클래스 자신을 타입으로한 필드를 정적멤버로 선언하고 그앞에 private을 붙인다. 그리고 그 필드에 new 연산자를 사용해 객체를 생성해준다.
예)

public class 클래스{

-필드

private static 클래스 singleton = new 클래스();

-생성자

private 클래스(){...}

-정적메소드

static 클래스 getInstance(){

return singleton;

}

}

이제 이러면 private이 있는 필드와 생성자는 외부에서 호출할수없다. 외부에서 호출하기위해서는 싱클톤이라는 필드를 리턴받는 getInstance(){}를 호출해 사용해야한다. 

그래서 만약 클래스 외부에서 

클래스 x1= 클래스.getInstance();

클래스 x2= 클래스.getInstance();

이런 식으로 클래스를 참조하더라도 객체는 하나뿐이기때문에 x1,2둘다 같은 객체를 참조하게 되는것

final 필드와 상수

파이널은 최종이란뜻이다.  요즘내 인생은 파이널이 아닌가 하는 생각을 한다. 나는... 가...끔...광안리.....수..온...ㅊ..ㅔ...크...르..ㄹ..한다.......

는 개소리고 말 그대로다 파이널 필드는 한번 값을 초기화 하면 값이 바뀔수 없는 필드이다. 

파이널 필드에 초기값을 주는 방법은 두 가지 있다. 다른 필드랑 똑같다.

필드생성과 동시에 초기화하는 방법과 생성자를 통해 값을 초기화하는 방법이다. 단순값이라면 생서과 동시에 초기화하고 외부에서 값을 받아와야한다면 생성자에서 초기화 해준다. 

만약 파이널 필드의 초기화를 하지않고 진행하면 에러뜬다, 어떻게든 초기화 할 수 있게 해놓고 넘어가자

상수(static final) 

감이오는가 스테틱이 붙었다. 그냥 불변하는 수라고 생각하자 예를 들어 파이 3.14를 상수라고 한다. 이런 값을 저장하는 필드를 자바에서는 constant라고 부른다. 

도데체 어느 부분이 그냥 파이널과 다른것인가. 인스턴스와 정적멤버의 관계와 비슷하다.

파이널 필드의 경우 객체마다 생성되고 생성자로인해 여러가지 값을 가질수도 있다.

상수인 Static final은 객체마다 저장되지않고 클래스에 포함되어 한번 초기 값을 받으면 변경할수없다. (솔찍히 아직 잘 모르겠다. )


정적 멤버와 마찬가지로 필드생성과 동시에 초기화 하거나 초기화블록을 만들어서 그안에서 초기화 할 수있다.

일반적으로 상수는 대문자로만 작성한다. 단어가 2개이상 조합된다면 _를 이용해 연결한다. 


자바정리와 연습 코드는 모두 신용권 선생님의 "이것이 자바다" 책을 참고하고있다. 

JavaStudy.zip

이전 글에서 다운받으셨다면 그거 지우고 이걸로 교체하시면 편합니다 누가 받겠냐만은..

bin.zip

 


'Java' 카테고리의 다른 글

정적인 자식 Static  (0) 00:22:21
메소드와 인스턴스멤버, this.  (0) 2018.11.19
자바 개발환경 구축  (0) 2018.10.09
Trackback 0 And Comment 0

메소드와 인스턴스멤버, this.

|

메소드

객체의 안에 존재하는 동작을 위한 중괄호{}블록.

객체를 생성 후 메소드를 호출하게되면 블록안의 모든 코드가 실행된다. 

객체간의 데이터 전달을 수행하고 외부에서 매개값을 받거나 값을 리턴 할 수도 있다.

메소드 선언 : 메소드의 선언의 경우 리턴타입. 메소드 이름 (매개변수){실행블록} 이다. 

예를 들어 int method (int x){ return x;} <= 리턴값이 있는 메소드 

리턴값은 메소드의 타입에 따라 있기도 없기도 하다. 

매개변수의 수를 모를경우

외부에서 많은 값을 받는대 몇개나 받을지 알 수 없을때는 배열을 매개변수로 받아 사용한다.

int sum(int[] values){   }< == 이런 방식의 메서드를 만들고 

호출할때는 int[] values ={1,2,3,4,5} 와 같이 배열을 만든 후 매개변수로 values를 넣어주는 식으로 사용한다.

다른 방식으로는 

int 변수명 = sum(new int[] {1,2,3,4,5})<이런식으로 한번에 처리할수도있다.

좀더 간편한 방법으로는 

메소드를 만들때 

int sum(int ... values){   } << 이런반식으로 만든다. ... 를 사용하면 여러 값이 들어온다는 뜻이고 메소드를 호출할때

int 변수명 = sum(1,2,3,4,5,6,)<< 이런식으로 사용할수있다 메소드 내부에서는 배열과같이 반응해서 동작한다.

리턴

retrun의 경우 메소드의 타입int, double...등과 같이 매개변수를 받아 연산후 값을 받아올때 사용한다. 

하지만 void같이 리턴값이 없는 타입도 return을 사용할수 있는데 이 경우 리턴 부분에서 메소드가 종료된다. 

while ,문에서 break와 같이 사용할 수 있지만 return의 경우 메소드를 강제종료 시키버리기때문에 뒤에 코드가 있는 경우

그냥 break를 사용하자.

메소드 호출

메소드의 호출의 경우 외부와 내부 호출이 있다. 

객체 내부에서의 호출같은 경우 그냥 "메소드명();" 으로 호출하면된다. 

객체외부에서 사용할 경우 객체의 주소를 참조하는 "참조변수명.메소드명();" 의 방식으로 사용한다.

메소드 오버로딩

생성자와 같이 메소드도 오버로딩이 가능하다. 

하나의 이름으로 여러 기능을 사용하기 위해 만들고 조건의 경우  같은 이름의 메소드, 매개변수의 타입, 개수, 순서가 달라야한다. 

ex)

int plus(int x, int y){   }

double plus(double x, double y){   }

이런 식으로 사용한다. 

이 경우 메소드를 호출할때 

int x=10; double = 20.3;

plus(x,y); 의 경우 에러가 날까?? 

안난다. 우리 위대한 자바는 알아서 자동변환해준다. 

인스턴스 멤버

인스턴스 멤버란?

객체를 생성했을때 사용할 수 있는 필드와 메소드를 말한다. 이때 각각 인스턴스 필드. 인스턴스 메소드라고 한다. 

this.

객체외부에서 참조변수를 사용해 객체에 접근하는 것과 같다. 객체 내부에서 필드에 접근하기 위해 this.를 사용한다. 

생성자, 메소드의 매개변수명의 경우 헷깔리지 않기 위해 필드명과 중복해서 사용한다. 이때 그 매개변수의 값을 필드에 넣고싶다면??

생성자. 매개변수의 안에서 필드를 불러오는데 일단 그안에서는 매개변수 명이 먼저기 때문에 그냥쓸수는 없다. 

이때 this.를 사용함으로서 객체 자신의 필드인것을 명확하게 한다.

모든 과정은 첨부된 자바파일을 확인하면 알수있다.

JavaStudy.zip

  


'Java' 카테고리의 다른 글

정적인 자식 Static  (0) 00:22:21
메소드와 인스턴스멤버, this.  (0) 2018.11.19
자바 개발환경 구축  (0) 2018.10.09
Trackback 0 And Comment 0

자바 개발환경 구축

|

네트워크 문제로 윈도우를 밀었다. 

깨끗하게 밀고나서 생각나는건 그냥 앞이 깜깜하다. 그동안 따라했던 환경변수들과 각종 언어에 관한 개발환경구축.. 

오라클은 7번을 새로깔았는데 한번 잘되니깐 바로 까먹었다. 그렇다 나는 답이업다.

그래서 이번기회에 하나하나 개발환경 구축과정을 써보고자한다. 일단 가장 기본인 자바 개발환경구축과 이클립스 설치 과정이다. 


자바개발을위해서는 일단 오라클에서 공짜로 지원하는 JDK가 필요하다.

https://www.oracle.com/technetwork/java/javase/downloads/index.html  <--다운로드 페이지


다운로드 페이지이다 파란 박스안의 아이콘은 최신 JDK다운로드 페이지로 가는 아이콘이니까 저거 누르자


다운로드페이지로가서 1번 동그라미쪽을 보자 적당히 동의 체크같은건데 체크해주자

그리고 2번 동그라미부분이다 나는 윈도우쓰니깐 윈도우 깔꺼다 그리고 잘보면 파일이 .exe , .zip 두가지인걸 볼수있다. 

우리는 다운로드해서 실행해야하니깐 .exe로 깔자 .zip은 킹갓엠퍼러 프로그래머님들만 알수있다. 

새로 재설치한 덕분에 내 컴퓨터는 아주 클-린한상태다 자랑하고싶었다. 

이제 저걸 실행시키자 다부루크리크다. 그런다음 게임다운로드한때처럼 그냥 다음다음 끝순서로 버튼누르면 다운로드된다.

이제 환경변수 차례다. 일단 제어판 --> 시스템 및 보안 --> 시스템 ->고급시스템설정으로 들어가자

이걸 누르면

속성 창이뜬다. 여기서 오른쪽 밑에있는 환경변수버튼을 누르자


새롭게 이 창이 뜬다.  부럽다 이놈들은 버튼만누르면 새로떠오른다. 내인생은 언제 떠오르는 버튼이 눌러질까.

찾아보니 위에는 로그인 사용자별로 환경변수를 설정하는것이고 밑의 시스템변수는 모든 사용자에게 공통적 적용 환경변수를 말한다. .

우리는 밑에 시스템변수에서 새로만들기를 클릭하자 

일단 첫번째로 JDK가 있는 위치를 환경변수로 만들어줬다. 

두번째로 첫번째와 같은 방식으로 CLASSPATH 라는 이름의 변수를 만든다 변수값은 %JAVA_HOME%\lib 이다.

세번째로 PATH변수를 편집한다. 

동그라미 순서대로 path클릭 후 편집 --> 새로만들기 누르고 4번의 내용을 기입한다. 그후 확인을 눌러 저장한다

마지막으로 잘 됬는지 확인하기위해 CMD창에들어가 javac -version을 치면

입력창 및에 javac 11이라고 뜬게 보이는가 잘설치하고 환경변수도 잘 설정했다는 증거다. 

'Java' 카테고리의 다른 글

정적인 자식 Static  (0) 00:22:21
메소드와 인스턴스멤버, this.  (0) 2018.11.19
자바 개발환경 구축  (0) 2018.10.09
Trackback 0 And Comment 0
prev | 1 | 2 | 3 | 4 | ··· | 7 | next