개발자 끄적끄적

클래스, 생성자 본문

JAVA

클래스, 생성자

햏치 2023. 3. 4. 15:01


*package : '폴더'라고 생각하면 된다


<클래스와 객체>

<class 구성 요소>
- class구성 요소를 크게 나누면 필드와 메서드로 이루어져있다.
1. 필드 : 클래스가 갖고 있어야 하는 값을 저장하는 변수
  멤버 변수라고도 하지만 자바 진영에서는 필드라고 부른다

2. 메서드 : 작업을 실행하기 위해서 작성되는 구조이다.
  멤버함수, 함수 등의 의미와 같지만 자바 진영에서는 메서드라 부른다 


//오류코드
class A{
  for(int i=1; i<=10; i++){
    System.out.println(i);  
}
}
- 클래스를 메서드에 집어넣지 않아서 오류가 난다
  즉, 반복문 for는 class의 구성 요소가 아니다
  따라서 for문은 하나으 메서드안에서 작성해야한다



<class 정의>
- 클래스명은 일반적으로 대문자로 시작하고, 변수명의 만드는 규칙과 일반적으로 같다
- 접근권한을 지정한다
- 선언된 class가 객체가 될 때 자동으로 실행되는 생성자 메서드를 작성할 수 있다




<접근 권한자의 종류>
1. public : 외부에 있는 어떤 클래스든 상관없이 접근하여 사용할 수 있게 한다
2. 생략 : 접근 제한자를 생략하는 경우이며, 같은 패키지내에 있는 클래스만 접근을 허용한다
           default나 package라는 의미로 사용한다






<클래스 수정자의 종류>
- 접근 제한자와 조합하여 사용될 수 있다

[클래스 수정자]
1. abstract : 추상 클래스를 만들 때 선언
2. final : 상속할 수 없는 클래스를 만들 때 사용
*추상 클래스는 객체를 생성할 수 없다

ex)아무나 접근할 수 있는 클래스 Memeber선언
public class Member{ ... }

ex)아무나 접근할 수 있는 추상 클래스 Member선언
public abstract class Memeber{ ... }
*추상 클래스는 객체 생성 불가

ex)같은 패키지내에서만 접근할 수 있는 클래스 Member선언(접근 제한자 생략)
class Member{ ... }

ex)아무나 접근할 수 있지만 상속할 수 없는 클래스 Member선언
public final class Member{ ... }





<필드 선언>
- 클래스가 갖고 있어야 하는 값들이 있다면 필드를 선언하여 저장한다
- 필드를 멤버변수라고도 하며 클래스 전체 영역에서 사용할 수 있기 때문에
   전역형 변수라고도 한다
- 클래스 내부에 어떤 곳에서든지 선언할 수 있지만 클래스 상단에 기술하는 것을
   원칙으로 한다




<필드의 구조>
[접근제한자][수정자 종류] 데이터 유형 필드명[=초기값];
- 데이터 유형은 변수의 데이터 유형과 동일
- 초기값을 지정하지 않으면 정수형은 0, 실수형은 0.0 객체형은 null값이 자동 대입
- 접근 제한자, 수정자의 기술 순서는 없다
- 접근제한자, 수정자 종류, 초기값 : 생략가능(option) 




<접근 제한자>
- 클래스와 기능이 동일하며 protected 와 private형태가 추가된다

1. public(아무나) 
- 외부에 있는 어떤 클래스든 상관없이 접근하여 사용할 수 있게 한다

2. protected(가족, 친척)
- 같은 패키지내에 있거나 상속관계에 있는 클래스들만 접근을 허용한다

3. 생략(가족)
- 같은 패키지내에 있는 클래스들만 접근을 허용한다(default나 package라는 의미로 사용)

4. private(나만)
- 클래스 외부에서는 접근할 수 없다






<수정자의 종류>
- 일반적인 의미는 클래스의 수정자 종류와 동일하지만 
  final의미는 클래스에서 사용했을 때와 다르다

1. fianl : 클래스에 붙어 있는 경우는 클래스가 상속되지 않도록 하는 기능이였으나
  필드에 붙어 있으면 값을 변경할 수 없게 한다
*(클래스)상속을 못하게/(필드)변경을 못하게

2. static 
- 정적 필드라  부르며, 이는 클래스가 객체가 되지 않더라도 클래스명으로 
  접근할 수 있게 한다 물론, 객체명을 통해서도 접근할 수 있다
- 클래스 공통변수라고도 하며 첫 번째로 객체가 생성되었을 때만 
  초기화되고 두 번째 부터는 객체가 생성되더라도 변경된 값이 초기화되지 않는다
  즉, 초기화는 한 번만 가능하다


<static형 변수 특징>
1. 클래스명으로 접근 가능
2. 초기화는 한 번
3. 클래스 공통변수(공통 값)


ex)static - 클래스 명으로 접근
package clazz;
class Data{
  public static int hp;
  public int score;
  final double PI=3.14;
}일 때


package clazz;
public static void main(String[]args){
  Data d = new Data();
  Data.hp=3; //가능(static(정적필드))
  d.hp=20; //가능(public)
  Data.score=10; //불가능(static이 아니기 때문)
  d.score=10; //가능(public)
  d.PI=3.0 //불가능(초기값을 바꿀 수 없다)




ex)static - 클래스 공통변수
package clazz;
public class Data{
  public int score = 5;
}일 때

package clazz;
public class AccTest{
  public static void main(String[]args){
    Data d = new Data();
    d.score=50;
    System.out.println(d.hp); //50
    Data d2 = new Data();
    System.out.println(d2.score); //5
}




ex)다른 패키지에서 사용가능 클래스가 사용 가능 한 지 확인
package core;

public class Another {

public static void main(String[] args) {
clazz.Data d = new clazz.Data();
d.score=10; //가능(접근자 : public)
d.def=10; //불가능(접근자 : 생략-같은 패키지 내의 클래스만 접근 가능)
                 d.hp=10; //가능(접근자 : public)
}
}


ex)외부에서 접근할 수 없는 정수형 필드 score 선언
private int score;
  
ex)아무나 쓸 수 있는 문자형 변수 grade 선언
public char grade;

ex)같은 패키지나 상속관계에 있는 클래스에서만 접근할 수 있는 실수형 변수 score 선언
protected double score;

ex)아무나 클래스명으로 접근할 수 있는 문자열 필드 address 선언
public static String address;

ex)아무나 접근 가능하고 지정된 값을 바꿀 수 없는 실수형 변수 PI를 선언하고
    초기값 3.14 대입
public final double PI = 3.14;

ex)클래스 공통변수를 아무나 접근할 수 있도록 정수현 변수 hp 선언
public static int hap;






<메서드의 정의>
- 클래스가 단순히 어떤 값만을 저장할 것이 아니라 어떤 기능을 하게 하려면
  메서도를 정의해야 한다
  메서드 없이는 어떤 기능을 수행할 수 없다. 메서드는 일반 언어의 함수와 그 역할과
  선언 방법이 유사하다. 메서드의 종류로는 생성자와 일반 메서드가 있다




<메서드 종류>

1. 생성자

- 클래스가 객체가 되어 메모리에 로드될 때 클래스의 초기화를 담당하는 메서드를
  생성자라 부른다
- 생성자를 기술하지 않으면 자바 가상머신이 매개변수가 없고 아무런 부가 기능도
  없는 생성자를 실행시켜준다
- 반드시 '클래스명과 동일'해야 한다
- 반환형을 사용할 수 없다
- 반환형을 사용할 수 없기 때문에 '반환값이 없다'
- 외부에서 값을 전달 받기 위해 매개변수를 추가할 수 있다


2. 일반 메서드 

- 클래스의 기능 구현을 하기 위해 작성된다
- 반드시 '반환형을 기술'해야 한다
- 처리된 결과를 메서드를 호출한 곳으로 전달 할 수 있다





<메서드 구조>
접근권한 수정자 반환형 메서드명( [ 매개변수 ] ){
 ...
 [ return 리턴값; ]
}
- 메서드를 정의할 때 반환형이 void가 아니라면 반드시 return문을 작성해야 한다
- 반환형은 자바가 사용할 수 있는 데이터 유형과 클래스 모두 사용할 수 있다
- 매개변수는 메서드가 실행될 때 필요한 정보를 외부에서 전달 할 때 사용되며
  반환형과 같이 자바 변수형과 클래스들을 필요한 만큼 '변수유형 변수명'을 
  한 쌍으로 ','로 나열한다





<수정자의 종류>

1. final : 클래스가 상속되었을 때 final이 붙은 메서드는 자속 클래스에서 메서드의 
           내용을 바꿀 수 없게 한다

2. static : 클래스를 객체로 만들지 않고 클래스명을 사용하여 접근할 수 있는 정적
            메서드를 만든다

3. abstract : 추상 메서드를 만든다. 추상 메서드는 메서드의 body부분을 작성하지 않고
                상속받은 자손 클래스에서 해당 메서드를 정의해야 한다

4. synchronized : 동기화 메서드를 만든다. 동기화 메서드란 동시에 2개 이상의 
                       프로세스가 메서드 내부의 처리 과정을 실행할 수 없게 하는 기능이다.
                       이를 상호 배타적 동기화라 부른다


ex)접근권한은 아무나, 반환값은 없고 매개변수도 없는 메서드
public void prn() { ... }

ex)접근권한은 아무나, 반환값은 정수형인 메서드
public int sum(){ 
  int x = 0;
  ... 
  return x;
}

ex)접근권은은 아무나, 반환값은 없고 매개변수가 문자열형 하나를 갖는 메서드
public void prn(String str){ ... }

ex)접근권한은 같은 패키지 안에서만, 문자열을 반환값으로 갖고 매개변수는 
   정수형 2개인 메서드
void String prn(int x, int y){
  String r = "";
  ...
  reutnr r;




<final수정자 사용 위치에 따른 의미 변화 정리>
클래스 : 상속 안된다
메서드 : 재 작성이 안된다
필드 : (초기)값이 변경되지 않는다



<static수정자 사용 위치에 따른 의미 변화 정리>
메서드 : 정적 메서드, 클래스를 객체로 만들지 않고도 접근 할 수 있다
필드 : 클래스 공통변수이며, 초기화는 한 번만 가능하다





<class 사용하기>
- class는 class만으로서는 사용할 수 없다
- 사용하기 위해서는 반드시 메모리에 올려야 하는데 이 올려진 class를 
  클래스 객체 또는 클래스 인스턴스(Class Instance)라고 한다
- class는 new연산자를 사용하여 메모리에 올리고 추후 해당 객체를 
  접근하기 위해 객체명에 대입하면 된다


<클래스를 사용하여 객체를 만드는 방법>
1. new 클래스명( [ 매개변수 ] )
2. 클래스명 객체명 = new 클래스명( [ 매개변수 ] )
3. 부모 클래스명 객체명 = new 클래스명( [ 매개변수 ] )
3. 부모 인터페이스명 객체명 = new 클래스명( [ 매개변수 ] )

[첫 번째 방법]
- 익명형(Anonymous)으로 객체를 생성한 것
- 객체명을 지정하지 않았기 때문에 추후 다시 접근할 수 없는 일회성 객체를 생성한 것

[두 번째 방법]
- 객체명을 지정했기 때문에 한 번 객체를 생성한 뒤 추후 필요할 때
  생성된 객체를 객체명을 통해 접근하여 재사용 가능

[세 번째 방법]
- 부모 개체형의 변수명에 자속 객체를 생성하여 대입할 수 있다
- 객체의 다형성이라고 부른다

[네 번째 방법]
- 세 번째 방법과 같은 이유로 가능
- 객체의 다형성 이라고 부른다


<객체 생성 예>

ex)Student클래스가 아래와 같이 정의되었을 때 Student클래스를 사용하여
  객체를 만들고 멤머들을 접근하는 예

[Student 클래스 정의]
public class Student{
  String irum; 
  int score;
}
- Student클래스는 아무나 접근할 수 있는 클래스
- 문자열형으로는 irum, 정수형으로는 score필드가 선언
- 선언된 필드들은 같은 패키지 내에서만(생략) 접근이 가능하다


[StudentTest 클래스 정의]
public class StudentTest{
  public static void main(String[]args){
    Student s = new Student();
      s.irum = "hong";
      s.score = 100;
      System.out.println("이름 :" + s.irum);
      System.out.println("성적 :" + s.score);
  }
}
결과 : 
  이름 : hong
  성적 : 100

- StudentTest클래스는 아무나 접근할 수 있는(public) 클래스
 - 클래스를 컴파일 하고 java StudentTest와 같이 실행하면 main함수가
  자동으로 실행된다
- main 함수 내부
  - Student클래스 타입의 변수(객체) s를 선언하고 Student클래스를 생성해서 대입
  - 생성된 s의 필드인 irum과 score에 값을 대입한다
  - 출력문장을 사용하여 s의 필드값들을 표준 출력장치에 출력한다


ex)필드와 매서드가 함께 있는 클래스 Member를 사용하는 예

[Member 클래스 선언]

public class Member{
  public String irum; //필드
  public String phone; //필드

public void set(String irum, String phone){ //로컬변수
  this.irum//필드 = irum; //로컬변수
  this.phone//필드 = phone; //로컬변수
}
public void prn(){
  System.out.println("성명 :" + this.irum);
  System.out.println("연락처 :" + this.phone);
  }
}
- public String irum, public String phone에서 irum, phone은 필드이다
- public void set(String irum, String phone)에서 irum, phone은
  set 메서드 내부에서만 사용할 수 있는 '로컬변수'이다
- this.irum, this.phone은 필드이다
- this는 멤버들만 사용이 가능하다
- Member 클래스는 아무나 접근할 수 있는(public) 클래스
- 문자열형으로 irum과 phone 두 개의 필드가 선언되어 있다, 이 두개의 필드는
  아무나 접근할 수 있다(public)
- set 메서드
  - 아무나 접근할 수 있으며(public) 반환값은 없다(void)
  - 문자열 타입으로 두 개의 매개변수가 정의되어 있다
  - 매개변수로 전달 받은 값들을 필드에 저장한다
- prn 메서드
  - 아무나 접근 할 수 있으며(public) 반환값도 없고(void) 외부에서 값을 
    전달받을 수 있는 매개변수도 없다
- 출력문장을 사용해서 필드에 있는 값들을 표준 출력장치에 출력한다




[Member 클래스 테스트]

public class MemberTest{
 
public static void main(String[]args){
  Member m = new Member();
  m.set("hong", "010-1111-1111");
  m.prn();
  }
}
- 아무나 접근할 수 있는(public) 클래스이다
- "hong"은 this.irum에 들어가고, "010-1111-1111"은 this.phone에 들어간다
- 클래스는 컴파일하고 java MemberTest를 실행하면 자동으로 실행되는 
  main함수가 선언되어 있다
- main 함수
  - Member 타입의 변수 m을 선언하고 Member 클래스를 생성해서 대입한다
  - 생성된 변수 m의 메서드 set을 사용하여 값을 전달한다
  - m의 메서드 prn을 실행한다


ex)생성자 메서드를 사용하여 필드를 초기화하는 클래스 Product

[Product 클래스]

class Product{
  String code;
  String codeName;
  public Product(String code, String codName){
    this.code = code;
    this.codeName = codeName;
}

public void prn(){
  System.out.println("code :" + this.code);
  System.out.println("codeName :" + this.codeName);
  }
}
- 갈틍 패키지 내에서만 접근 할 수 있는(생략) 클래스이다
- 문자열 필드인 code와 codeName이 선언되어 있는데 같은 패키지 내에서만
  접근할 수 있다
- 문자열 타입의 매개변수 2개가 있는 생성자가 기술되어 있다
- 생성자
  - 객체가 생설될 때 전달받은 두 개의 문자열을 각각 필드에 저장하고 있다
  - 생성자 접근권한이 public이지만 클래스 자체의 접근 권한이 default로 되어 있어
    생성자는 클래스 접근 권한에 영향을 받는다
- prn메서드
  - 표준 출력 장치에 필드의 값들을 출력한다


[Product 테스트 클래스]

public class ProductTest{

public static void main(String[]args){
  Product p1 = new Product("a001", "tv");
  Product p2 = new Product("a002", "computer");

  p1.prn();
  p2.prn();
  }
}
- 아무나 접근할 수 있는 클래스(public)이다
- 컴파일 후 java ProductTest를 실행하면 자동으로 실행되는 main함수가 있다
- main 함수
  - Product타입의 변수 p1, p2를 선언하고 Product클래스의 생성자를 통해 
    값을 전달하여 객체를 생성한 후 p1, p2에 객체를 대입한다
  - p1과 p2에 있는 메서드 prn을 실행한다 
  - p1과 p2는 독립된 객체이다
- new prn()은 불가능하다 -> prn)()은 생성자가 아니기 때문


[클래스 미션]
1. 성명, 국어성적, 영어성적, 수학성적을 생성자로 전달받아 필드에 저장하시오.
2. hap메서드를 실행하면 성적들의 합계와 평균을 구하여 필드에 저장하시오.
3. prn메서드를 통해 성적 정보를 표준 출력 장치에 출력하시오.
4. 성적은 score클래스에 작성, 테스트는 SocreTest클래스에서 처리하시오.

---------프로그램---------package clazz;

public class Score {

String mName;
double kor, eng, mat, sum, avg;

public Score(String mName, double kor, double eng, double mat) {
this.mName = mName;
this.kor = kor;
this.eng = eng;
this.mat = mat;
}

public void hap() {
this.sum = this.kor + this.eng + this.mat;
this.avg = sum/3;
}

public void prn() {
System.out.println("이름 :" + this.mName);
System.out.println("국어 :" + this.kor);
System.out.println("영어 :" + this.eng);
System.out.println("총점 :" + this.sum);
System.out.println("평균 :" + this.avg);
}
}


-----------------------------------------
package clazz;

public class ScoreTest {

public static void main(String[] args) {
Score s1 = new Score("이해선", 80,70,65);
Score s2 = new Score("이달선", 78,56,89);

s1.hap();
s2.hap();

s1.prn();
s2.prn();
}


}

'JAVA' 카테고리의 다른 글

GUI 프로그램  (0) 2023.03.04
배열(Array)  (0) 2023.03.04
연산자, 제어문  (0) 2023.03.04