본문 바로가기

IT/java

[java] Java 클래스 정리

java 클래스 정리

 

보충

 

Fuck f = new Fuck;

Fuck은 구체적인 함수등을 포함한 무엇

          클래스  ->  구체적
          object(객체) -> 추상적

_ 객체 변수라는 것은 없다.
_ f라는 객체 레퍼런스(참조)라는 것만 있다.
_ 객체 레퍼런스에는 객체에 접근하는 방법을 알려주는 비트가 들어있다.
_ 객체 레퍼런스에는 실제 객체가 들어있는 것은 아니고 그 객체를 가리키는 무언가가
있을 뿐이다.

----------

상속받는 방법은 두가지가 있으며
하나는 extends 이고, 다른 하나는 implements이다.
extends는 일반 클래스와 abstract 클래스의 모든 권한과 내용에의 상속에 사용되고, implement는 하나의 구현상속으로 interface상속에 사용된다.


 

 

 

 

1. 클래스의 기본 구성

 

클래스 밖에 올 수 있는 것들 = package, import, 또 다른 class

 

- 형식 :

 

  접근제한자 지정예약어 class 클래스명

      extends 상위클래스 implements 상위인터페이스{

}

 

 

 - 포함멤머 :

   - Nested Class : 중첩 클래스

   - Field : 데이터 저장 공간( 변수 , 멤버필드로 기억할 것)

   - Construct : 객체 생성 및 초기화 Method

   - Method : 특정 행위의 기술 영역

 

 

public class ExClass {
     public class A{} //inner class
 
     int x;         //필드
     ExClass() {}   //생성자 메소드
     void aaa() {}  //일반 메소드
}

 

2. 클래스 사용법과 메모리

 

_ 객체 생성 :

 

  클래스명 객체명 = new 생성자(매개변수);

                     Reference

                                       new 동적메모리할당연산자                           

                     

_ 연산자 : .(참조 연산)

 

_ 사용 :   객체명.Field   객체명.method

 

_ 객체 :   Reference 4byte, GC 영역 할당

 

 

 

 

//클래스 생성
class AA{
 int a = 100;
 int b = 200;
 int c = 300;
 
 ///이건 메소드 생성부. 클래스는 메소드와 달리 반환값이 없다
 void aaa(){
            System.out.println(a+" "+b+" "+c);
           }
      }

     public class ExClass {
           public static void main(String[] args){ //inner class
 
         AA a = new AA(); //AA를 사용하기 위해 a 라는 객체 생성
 
           System.out.println("a.a = "+ a.a);    //a 클래스의 변수  a 출력
           System.out.println("a.b = "+ a.b);
           System.out.println("a.c = "+ a.c);
 
           a.aaa();  //a의 메소드 aaa호출
 
      }
}


 

 

3. 생성자 메소드

 

1. 클래스명과 동일하다

 

public class ClassTwo {
       public ClassTwo(){}

}

 

 

2. 결과형 리턴값이 없다. // 이런 보이드나 리턴값 설정이 없다 void disp() {   }

 

3. 객체 생성 시 반드시 하나의 생성자 호출

 

4. 멤버 필드 값 초기화

 

5. 자동 default 생성자 호출 (생성자 없을 때)

 

6. 생성자 오버로딩 (생성자가 여러개 올 수 있다)

 

7. this와 this()

 

  _ 밑의 예제 2에서...this를 남발했는데, 멤버필드에 x를 선언   ->   해도 생성자의 매개변수 x, y가 생성자 메소드 내에서 선행되기 때문에 default값이 떨어질 것이다. 그러므로 매개변수를 넣어도 그것이 연결되지 않기 때문에 변수들이 멤버필드 소속이라는 this.를 넣어주어야 한다. (물론 필요 없는 변수들을 아래와 같이 모두 넣어야 하는 건 아니다)

 

 

EX)생성자 오버로딩

 

public class ClassTwo {
      public ClassTwo(){}

      public ClassTwo(){}

      public ClassTwo(){}

      public ClassTwo(){}

      public ClassTwo(){}

      public ClassTwo(){}

}

 

 

 

 

 

 EX 2)


public class ClassTwo {
 
      private int x;
      private int y;
 
      public ClassTwo(){
            this.x = 10;
            this.y = 20;
      }
      public ClassTwo(int x){
            this.x = x;
            this.y = 20;
      }
      public ClassTwo(int x, int y){
            this.x = x;
            this.y = y;
      }
      public ClassTwo(float a){}
      public ClassTwo(char a){}

    

     void disp(){
     System.out.println("출력");
     System.out.println("x = "+x);
     System.out.println("y = "+y);
    
     }
 
      public static void main(String[] args){    
            ClassTwo cc = new ClassTwo();            //x =10, y =20
            ClassTwo ct = new ClassTwo(999);        // x = 999, y = 20
            ClassTwo ct2 = new ClassTwo(55, 100); // x = 55, y = 100
 
            cc.disp();
            ct.disp();
            ct2.disp();
      }
}


 

 

 

this()  = this 메소드의 기능

  a = 100;
  b = 200;
  c = 300;

동일한 코드에  멤버필드에 위와 같은  a,b,c 값을 넣어주었다고 치자 .

이것들을 동일한 값으로  오버로딩된 다수의 생성자 메소드에서 쓰고 싶을 때, 일일이 this를 써 넣기 귀찮으면 아래와 같이 생성자 메소드 최상위에 this();메소드를 선언해주면 동일한 이름을 가진 변수에 값이 멤버필드에 선언된 값과 동일하게 된다. 모든 값을 동일하게 가질 수 있다.

그리고 아래는 달라질 수 있는 매개변수 x값만 따로 정해주면 되는 것.

 

 public ClassTwo(int x){
  this();
  this.x = x;


 

 

 

 

4. Garbage Collection

Garbage Collector의 역할

  - 더 이상 참조 받지 않는 Garbage Collection영역의 메모리를 삭제한다.

  -  어떤 공간이라도 해당 메모리를 참조하면 삭제하지 않는다.

  - 메모리를 과용해서 버퍼오버플로우가 발생하지 않도록

 

Garbage Collector의 호출

  - System.gc()    //사용자가 가비지콜렉터를 호출하지만 결정권자는 사용자가 아니기 때문에 무의미하다고 볼 수 있다

 

  - Low memory 상태에서 최하위 Thread로 동작

   //low memory, 메모리가 없을때, 참조값을 체크

 

 

_ 자바에서는 프로그래머 입장에서 일일이 참조값을 삭제할 필요는 없다고 한다... 나중에 더 봐야겠다.

 

 

5. 접근 제한자와 멤버필드

 

보충

_ 멤버필드에 public을 거의 사용하지 않는 이유는 전역변수 값에 영향을 받아서 엉망이 되지 않게 하기 위함인 것 같다. 따로 public 메소드 등을 이용.

_접근제한자가 없는 상태를 friendly상태라 한다


접근 제한자
  _ 클래스 내의 멤버에 접근을 제한하기 위한 예약어
  _ 하나의 클래스 내에 모든 멤버들은 제한자를 가진다.
  _ 클래스라는 것은 관리의 편의를 위한 하나의 집합.

접근제한자의 종류
  _ private : 하나의 클래스 내에서만 사용 가능한 멤버를 지정할 때 사용하는 제한자
  _ package : 동일 파일 + 동일 폴더, 패키지 내에서 사용 가능
  _ protected : 동일 파일 + 동일 폴더 + 상속이 가능하다
  _ public : 객체를 가진 모든 영역


 

 

Ex)

package mine;

class RankSub{
      private int x = 100;
      private char y = 'A';
      public void viewX() {
      System.out.println("x = " + x);
      }
}

public class Rank {
 
 public static void main(String[] args){
       RankSub r = new RankSub();
       System.out.println("x = " + r.x);  // 컴파일 에러,
       System.out.println("x = " + r.y);  // 출력이 되질 않는다.
       r.viewX(); // RankSub에 속한 메소드가 x,y를 접근할 수 있기 때문에 x가 출력이 될 것이다.
      }
}

 

Ex)  다른 클래스에 있는, 같은 패키지의 변수

 

따로 저장된 Abc_01라는 클래스

 

package 123;

public class Abc_01 {

 int x = 100;

 char y = 'A';

}

 

 

따로 저장된 Abc_02라는 클래스

package 123;

public class Abc_01 {

Abc_01 a = new Abc_01();  // Abc_01로 가는 경로  a 설정

System.out.println(a.x);

System.out.println(a.y);

}

 

 

 

6. 멤버필드와 멤버 메소드

 

멤버 필드의 형식 :

   접근제한자, 지정예약어, 자료형(클래스형도 가능하다), 필드명(사용자정의명) = 값;

 

멤버 메소드의 형식 :

   접근제한자   지정예약어   결과형리턴값==나가는 값

       메소드명(매개변수들 ==들어오는 값) throws 예외클래스들 {

            내용부

   }

 

Ex)

 

package mine;

import java.io.*;

 

//멤버 필드
class RankSub{
      private BufferedReader in;
      private String name;
      private int age;
 
      // 생성자
      public RankSub(){
            in = new BufferedReader(new InputStreamReader(System.in));
            name = "";
            age = 0;
      }
 
      // 멤버메소드
      public void setName()throws IOException {  
            System.out.print("이름 = ");
            name = in.readLine();
      }
 
      // 멤버메소드
      public void setAge()throws IOException {
            System.out.print("나이 = ");
            age = Integer.parseInt(in.readLine());
      }

 

     // 멤버 메소드

     public void disp(){
            System.out.println(name+"님,"+age+"살이군요");
     }

}

 

 

public class Rank {
 
      public static void main(String[] args)throws IOException{
            RankSub r = new RankSub();
            r.setName();
            r.setAge();
      }
}

 

7. 클래스로의 전환

 

기존 파일을 클래스로 변환시

  _ Field 영역 분리

  _ Construct 영역 분리

  _ Method 영역 분리

 

새로운 클래스 생성시

  _ Field 영역 분리

  _ Construct 영역 분리

  _ Method 영역 분리

 

[출처] 자바 java class 자바 클래스 정리, 접근 제한자, 멤버필드, 멤버메소드|작성자 19세기시민탁구