클래스
클래스 안에는 field (속성) 과 method (행동) 이 들어가 있다.
ex) 클래스 : 붕어빵틀 -> 객체(오브젝트) : 붕어빵 , 크림 붕어빵
-> 크림 붕어빵은 객체 = 크림 붕어빵은 붕어빵틀의 인스턴스이다. (인스턴스는 관계를 나타 냄)
1. 클래스 생성 class classname(){ ...... }
public을 쓸 수있는 클래스는 오직 파일명과 일치하는 클래스 뿐
2. 객체 변수 생성 호출 시: 변수.객체변수
3. 메소드 생성
함수 = 메소드 (자바에서는 메소드 라는 표현이 정확하다.)
- 메소드 구조
1. 입력과 출력이 모두 있는 메소드 : public 자료형 메소드명 (입력 자료형 입력변수,...)
호출 : 객체.메서드명(입력변수, 입력변수2)
2. 입력은 없고 출력이 있는 메소드 : public 자료형 메소드명 ( )
호출 : 객체.메서드명()
3. 입력은 있고 출력이 없는 메소드(출력문) : public void 메소드명(입력 자료형 입력 변수, ..)
호출 : 객체.메서드명(입력인수1, 인수2...)
4. 입력도 출력도 없는 메소드 : public void 메소드명( )
호출 : 객체.메서드명( )
5. 임의의 매개변수를 가진 메소드 : public 자료형 메소드명(입력 자료형 ... 입력변수)
호출 : 객체.메서드(입력변수1, 입력변수2... 임의)
this는 클래스 안에 있는 변수를 가리키게 된다. this.???=???를 입력하게 된다면 클래스안에
메소드들이 this로 선언한 변수를 사용할 수 있게 된다.
* 메소드 변수는 메소드 안에서만 쓰여지기 때문에 항상 같은 값을 유지한다.
변경된 속성 값을 유지하기 위해서는 return함수나 객체를 사용해야한다.
ex) public void 메소드명(class name 변수) { 변수.객체변수++ } 객체.메서드명(객체);
* call by value : 메소드 호출 시 사용되는 메모리의 값을 복사해서 보냄
12345678910111213141516171819202122 class Updater{public void update(int count) {count++;}}public class if_study {int count=0;public static void main(String[] args) {if_study my= new if_study();System.out.println("before: "+my.count);Updater up= new Updater();up.update(my.count);System.out.println("after: "+my.count);결과 : before :0 after:0why? : 메소드로 자료형을 전달하는 경우 객체의 속성 값은 변하지 않는다}}
123456789101112131415161718192021222324 class Updater{public void update(if_study counter) {counter.count++;}}public class if_study {int count=0;public static void main(String[] args) {if_study my= new if_study();System.out.println("before: "+my.count);Updater up= new Updater();up.update(my);System.out.println("after: "+my.count);결과 : before:0 after: 1why? : 메소드로 객체를 전달받는 경우 객체의 속성 값은 변한다 (주소 값)}}cs cs
* call by reference : 메소드 호출 시 사용되는 메모리의 주소를 복사해서 보냄
123456789101112131415161718192021222324 class Updater{public void update(if_study counter) {counter.count++;}}public class if_study {int count=0;public static void main(String[] args) {if_study my= new if_study();System.out.println("before: "+my.count);Updater up= new Updater();up.update(my);System.out.println("after: "+my.count);결과 : before:0 after: 1why? : 메소드로 객체를 전달받는 경우 객체의 속성 값은 변한다 (주소 값)}}cs
생성자 : 초기 값 지정 -> class_name (매개변수1,매개변수 2..){
this.매개변수1=매개변수1; this.매개변수2=매개변수2; .. }
설정자 : 필드 변경 -> void set메소드(매개변수) { this.매개변수=매개변수; }
접근자: 변경된 필드 읽기 ->반환형 get메소드() { return 매개변수 }
* get() set() 사용이유: 잘못 입력을 해도 방어적인 자세로 만들수 있게 해줌
set() - 값을 설정 -> 생성자에서 메모리 값을 할당하는 것이아니라 set 함수를 호출하게 된다.
get() - 값을 리턴 -> 생성자에서 데이터를 읽어오는 것이 아니라 get 함수를 호출하게 된다.
ex) get age() { return this._age; } set age(value) { this._age= value<0 ? 0 : value }
-> 나이를 0보다 작게 입력하면 0으로 그렇지 않으면 value로 쓰겠다.
-> 객체의 무결성을 보장하기 위함
-> 무결성 : 데이터의 정확성과 일관성을 유지 해주는 것 (=잘못된 데이터 입력 방지)
연속 호출 : 생성자 변수.메소드1 ().메소드2 ().메소드3() (바람직 하지는 않음)
지역 변수
메소드 내에서 선언되어 메소드 내에서만 사용가능 , 메소드가 종료되면 소멸
인스턴스 변수
객체별로 관리, 객체를 생성할 때 인스턴스 변수도 생성 소멸될 때도 자동으로 소멸
class { 변수 }
객체1.인스턴스 변수 = "red"
객체2.인스턴스 변수 = "blue"
2.1. 클래스 영역 내에서 선언되며 메소드를 호출 했을 때 넣어주는 값
2.2. 각각 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
클래스 변수 = 정적 변수
클래스 내에서 공유되는 값, 인스턴스에 따라서 변하지 않는 값이 필요할 경우 사용
class { static 변수 }
객체1.클래스 변수 =100 으로 수정하면 객체2.클래스 변수 또한 100으로 바뀜
하지만 이런 경우는 인스턴스변수와 클래스 변수를 헷갈리게 하기 때문에
클래스 변수 수정 시에는 class name.클래스 변수=?? 로 수정하는 것이 좋다.
3.1. 메인메소드안에서 객체변수.클래스변수=?? 로 값을 변경할 수 있다.
3.2. 모든 인스턴스가 공유하는 필드, 프로그램을 종료해야 소멸 됨
3.3. this 키워드 사용 불가 (어떤 것을 지정하기 애매하기 때문)
3.4. static 을 블록 형태로 사용할 수 있다 . ex) static { int a= 3; int b= 5 ... }
* 인스턴스 메소드는 클래스 멤버에 접근 가능 클래스 메소드는 인스턴스 멤버에 접근 불가능
'JAVA > 기본 문법 내용 정리' 카테고리의 다른 글
인터페이스 & 추상 클래스 (0) | 2021.10.05 |
---|---|
배열 [ ] & enum (0) | 2021.10.05 |
조건문 & 반복문 (0) | 2021.10.05 |
상속 (0) | 2021.10.05 |
변수와 데이터 형식 (0) | 2021.10.05 |