[Java] 클래스의 객체 / 인스턴스화

2021. 1. 19. 18:43Dev.Program/Java & Spring

728x90

< 클래스의 객체(인스턴스 생성) = 인스턴스화 >

p. 176

  • new 키워드를 사용하여 생성할 인스턴스의 클래스명을 명시
  • Heap 공간에 생성된 인스턴스 주소를 저장할 참조변수를 선언하고 해당 인스턴스 생성 후의 주소값을 저장
  • 인스턴스 생성 후에는 참조변수를 통해 인스턴스 접근 가능
    • ⇒ 변수명.멤버변수명 또는 변수명.메서드명() 의 형태로 접근
    • ⇒ 단, 자신의 클래스 내의 변수 또는 메서드는 참조변수 없이 바로 접근

< 클래스 정의 기본 문법 >

[제한자] class 클래스명 {
    // 멤버변수(인스턴스 변수) 선언
    // 멤버메서드 정의
}

< 인스턴스 생성 기본 문법 >

클래스명 변수명(참조형변수) = new 클래스명();


교재 p175 (클래스 생성)


======== Person.java 파일 만들기 (밑에 체크 빼기)

 

P. 179

< 멤버 변수 = 인스턴스 변수 >

  • 클래스 내부, 메서드 외부에 선언한 변수
  • 해당 클래스 내의 대부분의 메서드에서 공통적으로 사용 가능

  • 멤버변수(인스턴스변수) 선언
String name;
int age;
boolean isHungry;

  • 평소 선언하던 int형이랑 변수 색이 다름! (Local variable) → 이건 나중에 설명.

 

  • 선언 한 멤버변수는 어디서든 쓸 수 있다.
  • isHungry 값도 그냥 쓰면 됨.

  • 우리는 지금 class 를 만든거!

  • Person 은 식별자. 식별자 규칙 그대로 들고옴. (첫글자를 대문자로 쓰는 건 관례)

 

======== Ex.java 파일 새로 만들기(main 메소드 체크!)

 

< Person 클래스의 객체(인스턴스 생성) = 인스턴스화 > 

  • pe까지만 적고 + Ctrl + Space 하면 Person 나옴. (같은 공간에 있기 때문에 뒤에 아무것도 안적혀있음(연한 회색글씨) → package 개념인데 아직 안배움)

  • 뒤에서도 p만 적고 + Ctrl + Space 하면 Person 보여줌. (생성자 호출 → 나중에 배움) 

  • 이렇게 하면 인스턴스를 두개 만든거. 
  • p의 타입이 뭐다? Person 이다. (p2 도 마찬가지)

 

  • age, isHungry, name 변수
  • eat(), work() 의 메소드가 보임. (우리가 만든 인스턴스를 불러오는 것)

 

  • 변수명이 파란색 → 우리가 만든 거구나!!

 

  • Person 인스턴스의 이름, 나이, 배고픔 값 출력

 

Person 인스턴스의 메서드 work(), eat() 호출 해보기

⇒ 여기가장 많이 하는 실수!!

  • print 는 출력되는게 있어야 되는데, p.work() 는 리턴값이 없으므로 출력될 값이 없음.
  • 그래서 오류가 뜸!

  • 그냥 p.work(); p.eat(); 이렇게 호출하면 됨.

 

교재 p178-179

  • p와 p2 는 따로 관리되는 것을 알 수 있다!
  • p 와 클래스명(또는 클래스타입)이 Person 으로 같지만 new 를 통해 인스턴스 생성을 각각 수행했으므로, 인스턴스(메모리공간)가 다르다!
    • ⇒ 즉, 서로 다른 인스턴스(=객체)는 각각 다른 정보를 관리할 수 있다!

 

Ex 클래스 제일 끝 으로 가서 class 따로 만들어줌

( ⇒ 실무에서는 이렇게 안만들지만, 우린 연습이니까 편의상! 한번에 보기 위해서ㅎㅎ)

  • 하나의 java 파일(소스 파일) 내에 여러개의 클래스를 정의할 수 있다.
    • ⇒ 단, 파일명과 동일한 클래스를 제외한 나머지 클래스는 접근제한자를 빼고 정의함.

문제 )  멤버변수 : 이름(name), 나이(age)

   메서드 : cry() - 파라미터 X, 리턴값 X, "동물 울음 소리!" 출력

  • 풀이 ) 클래스 끝 에서 만들기

 

문제 )  Animal 인스턴스 2개 생성 후 다음과 같이 초기화 및 출력

  ------ 인스턴스1(ani1)

     이름 : 멍멍이, 나이 : 2

  "동물 울음 소리!”

  ------ 인스턴스2(ani2)

    이름 : 야옹이, 나이 : 3

  "동물 울음 소리!

  • 풀이 ) 다시 public static void main 안으로 들어와서 만들기



======== Ex2.java 파일 만들기(main method 체크 하기)

문제 )  학생(Student) 클래스 정의

  이름(name, 문자열), 반(ban, 정수), 국어(kor, 정수), 영어(eng, 정수), 수학(mat, 정수)

  메서드

  1) studentInfo() : 이름, 반, 국어, 영어, 수학 점수 출력

  • 풀이 ) Ex2 클래스가 끝난 지점인 제일 끝에서 만들기

  • s1 과 s2 인스턴스 생성

 

문제 ) getTotal() : 파라미터 X, 리턴타입 int ⇒ 국어, 영어, 수학 점수의 합 리턴

  • 풀이 ) public void studentInfo() 끝나고 밑에 적어주기
  • return kor + eng + mat; 도 가능

 

문제 )

  • 풀이 ) public int getTotal() 끝나고 밑에 적어주기

 

총점과 평균을 구하는 다른 방법 ) 변수 없이 바로 받아 오기.

System.out.println("평균 : " + s2.getAverage(s2.getTotal()));

System.out.println("평균 : " + s2.getAverage(s2.getTotal()));

  • s2.getTotal()가 제일 먼저 실행
  • s2.getAverage(237); 이 되는거랑 똑같음!

 

> 총점과 평균 전부 주석처리!

studentInfo() 로 가기

하나의 클래스 내의 메서드에서 또 다른 메서드 호출도 가능

  • 이름 만으로도 바로 사용 가능.
    • (=자신의 클래스 내의 변수 또는 메서드는 참조변수 없이 바로 접근)
    • 앞에 s1. s2. 이런거 안붙여도 된다는 말입니다! (자주 하는 실수!!!)
  • 클래스의 밖에서 쓸 때만 주소가 필요하다! (어디 있는지 모르니까~~)

  • 평균도 똑같이 가능
  • 이렇게 만들면 공통작업이 되기때문에 하나하나 안적어도 전체 출력이 가능함.

 

======== Test2.java 만들기. (main 체크)

문제 )   은행계좌(Account) 클래스

멤버변수

1. 계좌번호(accountNo) - 문자열("XXX-XXXX-XXX")

2. 예금주명(ownerName) - 문자열("XXX")

3. 현재잔고(balance) - 정수 (21억까지만 저장가능ㅋㅋ)

  • 풀이 ) Test2 제일 끝에 만들기

 

문제 ) 은행계좌 개설하여 다음과 같이 초기화 후 출력

계좌번호 : 111-1111-111

예금주명 : 홍길동

현재잔고 : 10000원

  • 풀이 ) main 안에 적어주기

 

문제 )  main 안에 syso 주석 처리 하고 메서드로 만들어 주기.

    1. 계좌번호, 예금주명, 현재잔고를 출력하는 showInfo() 메서드 정의

  • 풀이 ) a1. 은 안적어줘도 됨.
  • main 안에서 a1.showInfo(); 하면 출력값 확인 가능



문제 ) 2. deposit() 메서드

입금할 금액(amount, 정수형)을 파라미터로 전달받아 현재잔고(balance)에 누적

입금 과정(입금할 금액과 입금 처리 후의 잔고)을 다음과 같이 출력

 " 입금할 금액 : xxxxx원 "

 " 현재잔고 : xxxxx원 "

  • 풀이 )  클래스 안쪽에 적어주기

  • main 에서 a1.deposit(5000); 적어주면 이렇게 출력값 확인 가능

 

> 앞서 했던 건 입금기능.

이제 할 건 출금기능.

문제 ) 우선 해야할 거! ( 이따가 잔고가 출금 금액보다 적으면 출금 안되는 것도 추가할 거 )

3. withdraw() 메서드(파라미터 O, 리턴값 O) : 출금기능

출금할 금액(amount, 정수형)을 파라미터로 전달받아

"출금할 금액 : xxxxx원" 출력 후

현재잔고에서 출금할 금액만큼 차감 후 현재잔고 출력

"현재잔고 : xxxxx원"

 출금된 금액을 리턴

  • 풀이 )  class 안쪽에 적어주기

  • main 에서 a1.withdraw(3000); 적어주면 이렇게 출력값 확인 가능

 

  • 50000원을 뽑으면 안나와야 되는데(잔고가 모자라니까), 나온다!!!

 

> 그래서 문제 ) 출금 금액이 잔고보다 많을 경우 제어 : 추가해주기

  • 풀이 ) class 안 쪽에 적어주기.

  • if 문에서 리턴을 안해주더라도 우린 int 형 리턴을 무조건 해야함.
  • 경우의 수에 모두 리턴을 해줘야 함. (자주 하는 실수!!!!)
  • return 0; 을 안해주면 오류가 난다! (return 0;필수)

  • return amount;를 바깥으로 빼주고
  • if 문 안에 amount 값을 0으로 만들어줌.
    • ⇒ 이런식으로도 가능하다.

 

문제 ) 새로운 은행계좌 인스턴스 생성하여 사용해보기

  • 풀이 )

 

728x90

'Dev.Program > Java & Spring' 카테고리의 다른 글

[Java] 오버로딩 / 가변인자  (0) 2021.01.23
[Java] 변수 선언 위치에 따른 분류 / 접근제한자  (0) 2021.01.23
[Java] 메서드(Method)  (0) 2021.01.19
[Java] 2차원배열  (0) 2021.01.19
[Java] 배열  (0) 2021.01.19