이하 구디아카데미 김지훈 강사님의 수업자료와 강의 내용 정리, 실습한 내용을 정리함!
Static
정적 멤버와 static keyword
-
Static 영역은 클래스 원본이 자리 잡은 곳이다.
-
Member 에게 static 키워드를 붙이면 바로 이 영역에 저장이 된다.
-
그래서 static member 는 객체화 하지 않고 사용한다.
-
남발할 경우 원본 자체가 바뀌기 때문에 시스템 안정성에 좋지 않음
-
class
- public class 에 일반 변수를 int field = 0으로 선언
- static int sField = 134로 선언
- int multi 메서드에 a, b 매개변수를 넣으면 반환값으로 a*b 가 나옴
- static 영역의 int plus 라는 메서드는 a, b의 매개변수로 a+b를 뱉음
- static 영역의 int minus 라는 메서드는 a, b 를 넣으면 a-b 를 리턴함
- main
- Sub 클래스를 sub 변수로 객체화 해줌
- sub에서 field 값을 추력하면 0
- sub에서 multh 메서드를 사용하면 6*2 = 12 출력
- 원본 Sub의 sfield 라는 변수를 가져옴 134 출력
- 원본Sub의 plus 메서드를 가져와서 4+3을 해줌 7 출력
- 원본 Sub의 minus 메서드를 가져와서 10-5 을 해줌 5 출력
- sub의 sField를 가져옴 134
- sub 의 minus 메서드에 4, 3을 넣음 1 출력
- sub의 plus 메서드에 4, 3넣 넣음 7 출력
- 새 Sub를 sub2 에 복사해옴
- sub2.field 값을 10000으로 선언
- sub 의 필드 값은 0(sub 에서는 따로 선언하지 않았기 때문에 초기 값을 가져옴)
- sub2 의 필드값은 10000(선언한 값으로 가져옴
- Sub(원본의).sField를 3000으로 선언함(스태틱 값을 변경
- sub의 sField 값도 3000이 됨
- sub2의 sField 값도 3000이 됨
같은 멤버인데 저장 영역이 다를 경우!
- 입력
- 출력
- public class 이름은 Inner
- static main 메서드는 문자열 args
- st_msg 메서드 호출 : hello static member를 매개변수로 넣음
- "static 멤버 메세지=hello static member 출력
- Inner 클래스를 복사해서 inner 에 담음
- inner의 h_msg 메서드 호출 : Hello, java를 매개변수로 넣음
- 일반 영역 메시지=Hello, java 출력
- static st_msg 메서드 호출 msg+from heap를 매개변수로 넣음
- static 멤버 메세지=Hello, java 출력
- msg 출력 : Hello, java
- st_msg 메서드 호출 : static 멤버 메세지=이게 맞아? 출력
final keyword
-
final 은 한번 지정되면 프로그램 종료 시까지 변경이 불가능하다.
-
final 은 생성자에서만 초기화 가능하다.
-
static final 의 경우 객체화 초기화가 되지 않아 불변의 값으로 간주한다.
-
우리는 이런 필드를 상수(Constant)라고 하며 모두 대문자로 표기한다.
-
class
- public class은 Person 이다.
- 문자열 nation 변수를 final 로 지정한다.
- 문자열 name 변수를 final 로 지정한다.
- 문자열 SSN 을 statinc final 230811-1234567로 지정한다.(불변)
- public 클래스 Person 메서드의 매개변수는 문자열 nation, 문자열 name 이다.
- public 클래스 Person의 변수(필드) nation 에 nation 이라는 매개변수를 넣는다.
- public 클래스 Person 의 변수(필드) name 에 name 이라는 매개변수를 넣는다.
- Main
- Main 클래스의 main 함수는 문자열 args를 매개변수로 넣을 것이다.
- class Person 을 복사해서 person 변수에 넣는다. 가져오는 형태에 매개변수 nation에 값 korea 를 넣고 매개변수 name에 니콜을 넣는다.
- person 함수의 nation 값을 출력한다.
- person 함수의 name 값을 출력한다.
- 원본 Person의 SSN 값을 출력한다.
요약
Static 영역은 원본이 저장되는 영역이다.
Static 멤버를 호출할 때는 그래서 객체화하지 않는다.
그 외의 멤버는 모두 객체화를 하여 사용한다.
Final 은 프로그램 시작 시 한번 정의되고 나면 바꿀 수 없다.
Import
- class 를 객체화할 때 다른 폴더(package)에 있는 class 를 불러올 경우도 있다.
- 이 경우 우리는 import 문을 사용한다.
- Calculator2 class를 가져오기 위해 import 사용 예시
접근 제한 자
-
Java 에서는 접근을 허용하거나 제한할 수 있다.
-
남들이 사용할 수 있는 코드도 있지만 내부적으로만 사용할 코드도 있기 때문이다.
-
특정 부분의 접근을 제한하는 것을 캡슐화(Encapsulation)라고 한다.
-
Private 은 외부 class 에서 사용이 불가능하다.
-
외부에서 꼭 써야 할 경우 사용할 방법
-
class
- private 접근 제한을 boolean power 변수에 걸고 값을 false로 넣어 준다
- private 접근 제한을 int panSpeed 변수에 걸어 준다.
- private 접근 제한을 int temp 변수에 걸어 준다.
- 이것들을 각각 외부에서 조절 가능 / 외부에서 볼 수만 있게 제한 한다.
- isPower boolean 타입 함수에 반환값을 power을 넣어준다.
- setPower 함수에 매개변수 power를 넣고 power = 매개변수 power 로 작동시킨다.
- getPanSpeed 함수의 반환값을 panSpeed 로 뱉는다.
- setPanSpeed 함수에 panSpeed 매개변수를 넣고 panSpeed = 매개변수 panSpeed를 작동시킨다.
- temp 는 110 - panSpeed 이다.
- getTemp 함수는 temp 값을 반환한다.
- main
- Computer 클래스를 com으로 복사해서 가져온다.
- com의 setPower 함수에 true 값을 넣는다.
- 출력 power:true
- com의 setPanSpeed 함수에 80 값을 넣는다.
- 출력 getPanSpeed 80
- com.getTemp()를 출력하면 temp 값이 110-panSpeed 이기 때문에 30이 출력된다.
요약
- 불러올 member 가 다른 package 에 있을 경우 import 문을 사용한다.
- 모든 member 는 사용할 수 있는 영역을 지정하는 접근 제한자가 있다.
- Private 은 같은 클래스 내에서만 접근이 가능하다.
- public 은 다른 package 에서도 접근 가능하다.
--
- 점점 어려워지고 있고 혼란스럽다. 내가 정말 개발자가 될 수 있을까?
잘 봤습니다. 좋은 글 감사합니다.