개발자 끄적끄적
클래스, 생성자 본문
*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();
}
}