전편 상속에서 이어지는 내용이다:)

https://turtlemoon.tistory.com/13

 

JAVA 그게 뭐야? 12. 변수와 상속1

1. 변수 변수의 종류 - 지역변수(Local Variable) : 메소드 영역에 선언된 변수 - 인스턴스 변수(Instance Variable) : 클래스 영역 = 메소드 외부에 선언된 변수 - 클래스 변수(Class Variable) : static이 붙은..

turtlemoon.tistory.com

 


 

클래스 배열(참조 변수 배열)

객체를 여러 개 선언해야 하는 경우 배열 타입으로 한 번에 선언 후 사용

각 객체들은 규칙성이 없기 때문에 규칙성을 부여하기 위해서 사용한다.

 

 

클래스 배열 선언

Car myCar = new Car();

Car momCar = new Car();

Car dadCar = new Car();

 

- 선언방법1

Car[] carArr = new Car[3]

carArr[0] = new Car;

carArr[1] = new Car;

carArr[2] = new Car;

클래스명[] 배열명(참조변수) = new 클래스명[칸 수]

클래스명[index] = new 생성자();

 

- 선언방법2

Car[] carArr = {new Car(), new Car(), new Car()};

클래스명[] 배열명(참조변수) = {new 생성자(), new 생성자(), ...};

(이렇게 주로 사용할 예정)

 

 

클래스 배열 사용

배열의 각 칸이 하나의 객체이다.

 

carArr[0].color;

carArr[0].keyOn();

배열명[index].변수;

배열명[index].메소드();

 

 

그림 설명🌹

 


 

Casting(다형성)

부모 타입의 참조변수로 자식 타입의 객체를 다루는 것

하나의 객체가 여러 가지 타입을 가질 수 있다.

캐스팅을 할 경우 사용할 수 있는 "멤버의 개수"가 달라진다.

부모와 자식 관계만 서로 형변환이 가능하다.(모든 자식 객체는 부모 타입이기 때문에 형변환 가능)

 

// 기본

Monkey mk = new Monkey();

 

// 상속 관계일 경우 참조변수의 타입과 객체의 타입이 불일치 해도 ok

Monkey hummon = new Human(); 

 

- 업캐스팅(up Casting)

부모 타입의 참조 변수로 자식 타입의 객체를 다루는 것(자식 > 부모)

필드의 사용범위가 부모 타입만큼 제한되기 때문에 자식 타입에서 추가된 내용을 사용할 수 없다.

 

부모클래스 참조변수(객체명) = new 자식생성자();

참조변수.부모필드

 

// Car 부모 클래스, SuperCar 자식 클래스

Car myCar = new SuperCar();

*** 자식 타입의 참조 변수로 부모 타입의 객체를 가리킬 수 없다. ***

ex. SuperCar myCar = new Car();   // error

사설. 즉, 부모 타입의 참조 변수는 자식 타입의 필드보다 무조건 작거나 같기 때문에 자식 타입의 필드에 들어갈 수 있지만, 부모 타입의 필드는 자식 타입의 필드보다 작거나 같기 때문에 자식 타입의 참조변수를 받아들일 수 없다.

큰 물그릇에는 작은 물그릇에 퍼올린 물을 담을 수 있지만 작은 물그릇에는 큰 물그릇에서 퍼올린 물을 다 담을 수 없는 걸 생각하면 되지 않을까...

 

- 다운캐스팅(down Casting)

업캐스팅된 객체(부모타입의 참조변수)를 다시 자식타입으로 바꾸는 기법(부모 > 자식)

다운캐스팅 시 다시 자식클래스의 필드를 사용할 수 있게 된다.

 

자식클래스 참조변수(객체명) = (자식클래스)업캐스팅 객체

참조변수.자식필드

 

- 형변환 시 중요 point!

만든 인스턴스(객체)가 무엇인지 중요!!! 실제 인스턴스의 멤버 개수를 넘어서는 안된다.

 

- Casting을 사용하는 이유?

여러 개의 자식 객체를 한 번에 관리해야할 때가 있다.

여러 자식 객체를 전달받기 위해서는 부모 타입의 저장공간으로 받아야 한다.

그래서 업캐스팅을 통해 서로 다른 타입의 자식 객체들을 부모타입으로 만들어 하나의 객체(부모 타입)에 받을 수 있게 한다.

> 그럼 부모클래스가 여러 자식 클래스들을 관리할 수 있게 된다.

> 그렇지 않으면 여러 자식들이 각자 객체를 생성하여 객체마다 필드를 사용하기 때문에 관리가 어려워짐

 

 

그림 설명🌹

 

 

instance of

객체 간 타입을 비교해 참조변수의 형변환이 가능한지 확인

객체 instance of 클래스명 : 객체가 뒤에 오는 클래스의 타입인지 비교

만약 객체가 해당 클래스 타입이라면 true, 아니라면 false 반환

 

부모객체 instanceof 부모클래스 : true

자식객체 instanceof 자식클래스 : true

부모객체 instanceof 자식클래스 : false

자식객체 instanceof 부모클래스 : true

업캐스팅된 객체 instanceof 부모클래스 : true 

 

 

예제

부모 클래스 Car 생성
자식 클래스 SuperCar 생성
업캐스팅, 다운캐스팅 사용
자식 클래스 ElectricCar 생성
클래스 배열 사용(업캐스팅)
다운캐스팅 실습과 instance of 사용

 

 


728x90
1. 자바 설치

https://www.oracle.com/java/technologies/downloads/#java8-windows

 

오라클 홈페이지에 들어가서 아래로 내려가면 Java 8 버전을 찾을 수 있다.

 

 

 

자신의 운영체제와 환경에 맞는 파일을 다운로드 받으면 된다.

윈도우의 경우 x86은 32bit, x64는 64bit를 뜻한다.

'내 PC'에서 마우스 오른쪽 버튼 클릭 후 속성에 들어가면 확인 가능!

 

다른 거 변경 없이 쭉 그대로 설치해 주었다.

환경변수 설정도 하지 않음. 찾아보니 환경변수를 설정하는 이유는 명령 프롬프트에서 직접 자바를 컴파일 하기 위해서라고 한다. 하지만 굳이 명령 프롬프트를 실행해서 java/javac를 사용할 이유가 없으니, 마찬가지로 환경변수를 굳이! 설정할 필요도 없다고...

+ 나중에 강사님 설명을 들으니 요즘 자바는 굳이 환경변수 설정을 하지 않아도 쓸 수 있고,

+ 또 자바가 여러 버전이 있을 때 메인으로 쓸 버전을 정하는 방법으로 환경변수 설정을 한다고 한다

 

 

2. 이클립스 설치 및 설정

설치한 자바에 맞는 버전의 이클립스를 다운받아야 한다고 한다.

 

https://www.eclipse.org/downloads/packages/release/photon/r

 

Photon R | Eclipse Packages

432 MB 8,194 DOWNLOADS The Modeling package provides tools and runtimes for building model-based applications. You can use it to graphically design domain models, to leverage those models at design time by creating and editing dynamic instances, to collabo

www.eclipse.org

 

 

이클립스 Phton R Packages에서 Eclipse IDE for Java EE Developers를 다운로드했다.

자바와 마찬가지로 자신의 컴퓨터에 맞는 운영체제를 선택해서 다운로드 하면 된다.

 

맥북에 설치한 거랑 아이콘 모양이 달라서 찾아보니 기능이 좀 다른 듯 했다.

맥북에 설치한 건 수업 들으며 연습하기 적당한 버전이고 오늘 설치한 게 나중에 웹 어플리케이션 개발할 때도 사용 가능한 이클립스라는 모양...

맥북에 있는 걸 다시 깔까 했지만 그냥 나중에 필요하면 인텔리제이 구매해서 까는 걸로..

 

설치가 끝난 후 이클립스를 실행한다.

처음에 키면 워크스페이스를 정하라고 창이 뜬다. 캡처는 까먹었당.

그냥 자바 연습하는? 실습하는? 것들을 어디에 저장해둘지, 파일 다운로드 경로 설정하듯 설정해주면 된다.

 

마찬가지로 캡처 없는 웰컴 창. 그냥 꺼주면 된다.

 

 

처음 들어가면 아래쪽과 오른쪽 사이드바에 이것저것 많이 켜져 있는데, 심플하게 다 지우고 Package Explorer와 Console만 남겨두었다.

Console 창은 Window-Show View-Console 순으로 선택해주어야 한다.

그 밖에 띄워둬야 할 것이 있다면 Window-Show View에 들어가서 선택하면 된다.

 

그리고 Window-Preferences로 들어가 enc를 검색한다.

 

 

파일을 왔다갔다 옮길 때 글자가 깨지는 걸 방지하기 위한 설정이다.

실제로 기초 수업을 들을 때 학원에서 듣고 파일을 맥북으로 가져와 실행했는데 다 깨져있었다. 아마 위 설정을 안해줘서이지 않았을까...

 

Content Types에서 Text를 클릭하고 맨 아래 Default encoding 칸에 UTF-8을 입력해준다.

UTF-8은 가장 많이 쓰이는 가변 길이 유니코드 인코딩이라고 한다. 구글이 그랬다. 정확히 뭔지는 모르겠는데 새벽 3시 반이라 머리가 안 돌아가서 더 검색할 의지가 없다. 

 

Workspace부터 XML Files까지 전부 encoding 언어를 UTF-8로 변경해준다.

 

요렇게 하면 이클립스 기본 설정까지 완료!

728x90

1. 변수

변수의 종류

- 지역변수(Local Variable) : 메소드 영역에 선언된 변수

- 인스턴스 변수(Instance Variable) : 클래스 영역 = 메소드 외부에 선언된 변수

- 클래스 변수(Class Variable) : static이 붙은 변수로 클래스 영역에 선언. 모든 객체 간에 공유하기 때문에 공통적인 요소일 때 사용

클래스 영역 : class 블럭 { 시작부터 } 끝까지

메소드 영역 : method 블럭 { 시작부터 } 끝까지

  지역 변수(lv) 인스턴스 변수(iv) 클래스 변수(cv)
초기화 수동 자동
(자료형의 타입에 따라 초기화되는 값이 다르다)
자동
생성 시기 변수 선언문이 수행됐을 때 객체가 생성 됐을 때★ 클래스가 메모리에 올라갔을 때
생명 주기 }(닫는 중괄호)
(메소드가 호출되어 작업하는 동안에만 사용됨)
프로그램 종료 시 프로그램 종료 시

지역변수는 메소드가 호출되어 작업하는 동안에만 사용되기 때문에 생명주기가 짧다.

지역변수는 초기화를 수동으로 해줘야 하지만, 인스턴스변수와 클래스변수는 자동으로 초기화 된다.(자료형의 타입에 따라 초기화 되는 값이 다르다)

- int > 0

- boolean > false

- double > 0.0

- String > null

클래스 변수는 자동으로 메모리에 올라가기 때문에 객체를 생성할 필요가 없다.

 

 

static

static은 인스턴스 멤버(인스턴스 변수, 인스턴스 메소드)에 붙여서 사용할 수 있다.

 

- static 메소드

객체 생성이 필요 없기 때문에 클래스 이름을 통해 호출 가능하다.

static 메소드 내에서는 인스턴스 멤버들을 사용할 수 없다.(인스턴스 멤버들은 객체 생성을 해야 사용 가능하기 때문)

static 메소드는 static 변수(cv)와 지역변수(iv)만 사용 가능

 

- 인스턴스 메소드

객체 생성 후, 참조 변수를 통해 메소드를 호출한다.

메소드 내에서 인스턴스 변수를 사용할 수 있다.

 

- 언제 static을 붙이면 될까?

변수의 경우, 객체가 공통적으로 공유해야 하는 속성에 static을 붙여서 사용

메소드의 경우, 인스턴스 멤버들을 사용하지 않을 때 static을 붙여서 사용

지역변수(lv)를 통해 작업하기 때문에 인스턴스 멤버가 필요 없다.

 

 

예제

 


 

2. 상속

두 클래스를 부모와 자식으로 관계를 맺어주는 것

기존에 선언된 클래스의 필드를 다른 클래스에서 사용하고자 할 때(코드의 재사용)

 

상속 문법

class A{   // 부모 클래스

     부모 클래스의 필드

}

class B extends A{   // 자식 클래스

     ...

}

 

A : 부모 클래스, 상위 클래스, 슈퍼 클래스

B : 자식 클래스, 하위 클래스, 서브 클래스

 

- extends : 상속의 키워드로, 부모의 인스턴스 변수를 상속받은 자식은 계속 확장된다.

 

 

상속의 특징

자식은 부모의 모든 멤버를 상속받는다.

자식의 멤버 개수는 부모의 멤버 개수보다 많거나 같다.

부모의 변경은 자식에 영향을 미치지만, 자식의 변경은 부모에 영향을 미치지 않는다.

 

 

예제 1

자식 클래스는 부모 클래스의 모든 멤버(int data, void talk())를 상속받고, 멤버를 추가해서 사용할 수 있다.

자식의 멤버 개수는 부모보다 같거나 많을 수 있으니까!

 

 

오버로딩(new)

이름만 같은 "새로운 메소드"를 정의하는 것

 

- 오버로딩의 조건

① 메소드 이름이 일치해야 한다.

② 매개변수의 개수 또는 매개변수의 타입이 달라야 한다.

오버로딩 메소드 사용 시, 전달된 값의 타입 혹은 개수를 알아서 구분하여 알맞은 메소드가 자동으로 호출된다.

 

 

오버라이딩(change, modify)

상속받은 부모의 메소드를 자식 클래스에서 자신에 맞게 변경하는 것

구현부(내용)만 변경할 수 있다.

 

- 오버라이딩의 조건

① 선언부(리턴타입, 메소드명, 매개변수 목록)가 부모클래스의 메소드와 일치해야 한다

② 접근 제어자를 부모클래스의 메소드보다 좁은 범위로 변경할 수 없다(public, protected, default, private).

③ 예외는 부모클래스의 메소드보다 많이 선언할 수 없다.

 

 

오버로딩과 오버라이딩 차이점

오버로딩은 같은 이름의 메소드를 '새롭게' 만드는 것. 그러므로 선언부의 매개변수이 개수와 타입을 다르게 만들 수 있다. 또한 상속과 전혀 관계가 없다.

오버라이딩은 구현부{}의 내용만 변경 가능하고, 선언부는 변경 불가능. 부모 메소드와 일치해야 한다. 또한 상속을 받았을 경우만 가능하다.

 

 

super() : 부모 생성자

자식 생성자에서 첫 줄에 항상 super()를 통해 부모 생성자를 호출해야 한다.

why? 자식의 생성자는 항상 자신이 선언한 것에 대해서만 초기화해야 한다. 부모 클래스의 인스턴스 멤버는 부모 생성자가 초기화 해야한다.

자식 생성자의 첫 줄에 super()를 써주지 않으면 컴파일러가 자동으로 삽입한다.

 

 

예제 2

- 부모 클래스에서 인스턴스 멤버들을 선언. 선언 역시 새롭게 메소드를 정의하는 것이라 일종의 오버로딩으로 볼 수 있음

- 메소드 이름이 같지만(eat) 매개변수의 개수 또는 타입이 다르기 때문에 가능(오버로딩)

- 자식 클래스는 부모 클래스를 상속받으므로 super()생성자를 적어준다. 생략해도 컴파일이 자동으로 생성하기는 함

- 부모 생성자의 변수를 자식 클래스에서 초기화할 수 없으므로 super()를 이용해 부모에게 넘긴다.

- 부모 클래스의 인스턴스 메소드의 구현부를 수정하는 것이 오버라이딩

- 부모 클래스 객체를 불러와 사용했을 때는 부모 클래스의 메소드들이 사용됨

- 자식 클래스 객체를 불러와 사용하면 부모 클래스에서 상속받은 멤버들과 자식 클래스에서 새로 선언한 메소드들이 사용됨

- 자식 클래스의 기본 생성자에서 super() 생성자로 부모를 받았으므로 "나는 부모 생성자!"가 먼저 출력된 후 "나는 자식 생성자!"가 출력된다.

 

 

실습

 


 

알듯말듯 눈알이 팽글팽글 도는 달거북씨ㅠ

 

728x90

세상에... 오랜만에 하는 복습이다. 열심히 공부하시라구요!

 


 

객체지향 파트 시작! 중요★

객체 지향 언어

코드의 재사용성을 높이고 유지보수가 용이함

 


 

1. 메소드

메소드

이름 뒤에 소괄호가 있는 것

단, 키워드 뒤에 소괄호는 메소드가 아니다.(ex. if, while, for, switch, ...)

 

       f              (x)           =     2x+1;

메소드이름   매개변수   대입   리턴값

 

* 매개변수는 외부(호출한 곳)에서 전달한 값을 받아서 메소드로 오게 해주는 중간다리 역할을 한다.

 

- 메소드의 목적

   ① 코드의 재사용(특정성을 부여해서는 안된다.)

   ② 소스코드 간결화로 이해하기 쉬워진다.

   ③ 모듈화(하나의 코드/로직을 여러 개의 메소드로 분리할 경우 유지보수가 용이하다.)

 

 

메소드 선언

① 리턴타입 ②메소드명 (③자료형 매개변수1, 자료형 매개변수2, ...){

          ④ 호출 시 실행할 문장

          ⑤return 리턴값;

 

메소드는 선언부(①②③)와 구현부(④⑤)로 이루어져 있다.

① 리턴 값이 있다면 리턴 값의 자료형을 선언, 리턴 값이 없다면 void를 선언(리턴 값과 리턴 타입의 자료형이 일치해야함★)

② 동사로 작성 (ex. eat(), sum())

③ 외부에서 전달받아야 하는 값이 있다면 자료형과 순서에 맞게 선언해준다. 생략이 가능하지만, 생략 시 외부에서 값을 전달받을 수 없게 된다.

④ 생략이 가능하며, 메소드의 기능을 구현하는 로직(알고리즘)을 작성한다.

⑤ 리턴 값은 메소드의 연산처리 결과값이다. 리턴 타입이 void일 때 생략이 가능하다.(컴파일러가 자동추가) 하지만 리턴타입이 있을 경우 절대 생략 불가

return을 만나면 메소드를 종료하고 다시 호출한 곳으로 되돌아간다.

 

- 메소드의 선언 순서 예시. 두 정수의 곱셈 메소드 선언

메소드 이름을 생각하고 소괄호와 중괄호를 붙인다.

    multyply(){}

 

어떤 매개변수를 받아올지 생각한다.(두 정수를 받기 위해 매개변수 두 개 필요)

    같은 타입의 매개변수를 여러 개 받아와도 자료형은 각각 써줘야 한다.

    multyply(int num1, int num2){}

 

 

실행할 문장 작성

    multyply(int num1, int num2){

          int result = num1*num2

    }

 

외부로 반환할 리턴값을 작성한다.

    multyply(int num1, int num2){

          int result = num1*num2

          return result;

    }

리턴 값을 통해 선언부의 리턴 타입을 결정한다.

***재사용성과 유지보수를 위해 하나의 메소드는 한 가지 기능만 수행하도록 작성한다.(리팩토링)***

 

 

메소드 사용

메소드는 클래스 내부에 있으므로 해당 메소드가 속해 있는 클래스 타입으로 먼저 참조변수를 만들어 줘야 한다.(객체화 필수)

 

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

참조변수명.메소드명(); > 매개변수가 선언되지 않은 경우

참조변수명.메소드명(값1, 값2, ...); > 매개변수가 선언된 경우

 

메소드에 매개변수가 선언된 경우에는 개수와 타입에 맞게 값을 넘겨주어야 한다.

리턴 타입이 void일 경우, 리턴 값이 없기 때문에 사용 시 그냥 호출해도 ok. 만약 리턴 타입이 있을 경우, 사용 시 메소드 통째로가 "리턴 값"이기 때문에 값을 담을 변수를 만들어줘야 한다.

메소드가 수행 중 return을 만나면 실행을 종료하고 자신을 호출한 곳으로 돌아간다.

 

 

메소드 예제

'f(x)=2x+1', '이름 10번 출력' 메소드를 선언 후, Ex1_Method ex1 = new Ex1_Method();로  불러와서 사용.

ex1.sayMyName("홍길동"); > 홍길동이 10번 출력

int result = ex1.f(10); > (2*10 + 1) 과정을 거쳐 21 출력

리턴 값의 타입, 선언부 리턴 타입, 리턴 값을 담을 변수 타입이 모두 일치해야 한다. 위 예제는 int로 전부 일치

 

 

메소드 실습

① 1부터 10까지 for문으로 반복 출력하는 메소드를 만들어준다. 이때 지문대로 system.out.println()으로 선언하고, 리턴 값이 없기 때문에 void를 선언한다. 

② 1부터 10까지 더한 합을 구하는 문장을 만들고 sum에 리턴 값을 받는다. 리턴 값이 int이므로 리턴 타입도 int 

③ 이름을 n번 출력하는 메소드. n번 값을 받아야 하므로 매개변수 int cnt를 만들어준다. for문을 통해 n번 반복 출력문을 만들고 리턴 값이 없으므로 void 선언

④ 2번과 동일하지만 n번 값을 받을 매개변수 int num을 만들어준다. 

⑤ 세 개의 정수를 받아야 하므로 int 타입의 매개변수 세 개를 만들어준다. 같은 타입의 매개변수여도 int를 모두 붙여준다(int num1, int num2, int num3). 리턴 값이 int이므로 리턴 타입도 int

⑥ 두 개의 정수를 받아야 하므로 int 타입의 매개변수 두 개를 만들어준다. 실수로 만들어줘야 하므로 리턴 값과 리턴 타입 모두 double로 받는다.

⑦ 문자열과 문자를 받을 매개변수를 각각 만들어준다(String str, Char c). 갯수를 세어야 하므로 count 변수를 초기화해주고, for문을 문자열의 길이만큼 반복한다. charAt()를 통해 문자열(str)을 하나씩 문자로 불러와 c와 비교. 리턴 값인 count는 int이므로 리턴 타입도 int

⑧ 배열과 n번 값을 받을 매개변수를 각각 만들어준다(int[] arData, int idx). 사용자가 볼 땐 두번째 자릿값이어도, 인덱스는 0번부터 시작하므로 1번자리가 된다. 따라서 arData[idx-1]이 되어야 한다. 리턴 값은 int이므로 리턴 타입도 int

8번의 메소드 사용을 보면, for문을 통해 배열에 5개의 숫자를 넣어주고 세번째 자리값을 출력했다. 인덱스 상에서는 두번째 자리값.

 


 

2. 클래스

클래스 Class(반)

서로 관련있는 요소들을 추상적이게 묶어 놓은 틀

여러 변수들과 메소드들을 한 번에 관리할 수 있다.

 

- 클래스 목적

공통요소를 매번 선언하는 작업이 불편하기 때문에 클래스에 선언하여 필드에 공통요소를 한 번만 선언하고, 클래스를 사용할 때 클래스 타입의 객체를 사용한다. 그래서 하나의 클래스 타입으로 여러 개의 "객체"를 생성할 수 있다.

(하나의 제품설계도로 여러 개의 제품을 만들 수 있다.)

 

- 객체화

클래스는 추상적인 개념이라서 바로 사용할 수 없기 때문에 필드들을 구체화시킬 대상이 필요하다. 그래서 객체화를 통해 구체적인 "객체(instance variable)"를 만든다.

 

객체 = 속성(변수) + 기능(메소드)

Car = 속성(색상, 브랜드, 가격) + 기능(시동켜기, 시동그기, 클락션 울리기 등)

 

추상적인 개념인 클래스를 객체로 구체화해서 만드는 작업을 객체화(instance화)라고 한다.

 

클래스 ------------> 객체(인스턴스)

            객체화

 

객체 생성을 통해 안에 있는 속성(변수)과 기능(메소드)를 사용할 수 있다.

(설계도를 통해 제품을 생성해 제품을 사용한다.)

 

- 타입

클래스를 통해 객체가 만들어지기 때문에 객체의 타입은 해당 클래스 타입이다.

Car         firstCar;

클래스명  객체명;

 

- 주어

클래스명의 첫 글자는 항상 대문자로 적는다.

 

 

클래스 선언

다른 클래스 외부에서 선언한다.

class 클래스명{

          필드(변수 선언, 메소드 선언)

          실행문(for, sysout, ...) x

}

 

 

클래스 사용(객체 생성과 사용)

객체화 : 클래스는 추상적인 틀이기 때문에 먼저 객체를 만들어서 객체화시킨다.

객체 생성을 통해 안에 있는 변수와 메소드를 사용한다.

 

①클래스명 ②객체명 = ③new 클래스명(); 

④객체명.변수

⑤객체명.메소드();

 

① 객체를 만들 클래스 타입

② 객체를 다룰 참조변수로 주소값을 저장한다

③ 객체를 생성하며 주소값을 반환한다. ***이때 클래스명()은 생성자를 호출하는 의미

④ 만들어진 객체를 통해 안에 있는 변수를 사용한다.

⑤ 만들어진 객체를 통해 안에 있는 메소드를 사용한다.

new 연산자를 통해 메모리에 올라가면 주소값을 부여받는다. 그 때 할당된 주소값은 참조변수에 저장된다. 따라서 참조변수를 출력하면 주소값이 나타난다.

 

클래스 선언(설계도) > 객체생성(제품만들기) > 객체사용(제품사용)의 순서

 

 

생성자

new 연산자를 통해 객체(인스턴스)를 생성할 때 반드시 호출되는 일정의 메소드

객체 생성 시 객체(인스턴스 변수)를 초기화하기 위해 사용한다.

 

클래스명(자료형 매개변수1, ...){

          객체 생성 시 수행할 코드

          주로 객체의 변수를 초기화하는 코드

}

 

이름이 클래스 이름과 같아야 하고 리턴 타입이 없다.(void도 붙이지 않는다.)

생성자는 메소드와 똑같은 기능을 가지고 있지만, 리턴을 할 수 없기 때문에 메소드라고 부르지 않는다.

클래스는 무조건 생성자를 1개 이상 가지고 있어야 한다. 만약 생성자를 만들지 않았을 경우, 컴파일러가 자동으로 "기본생성자"를 만들어준다(생략가능). 하지만 직접 생성자를 선언할 경우, 생성자가 하나 이상 있기 때문에 기본 생성자를 만들어 줄 필요가 없다.

 

- 기본 생성자란?

매개변수가 없는 생성자

생성자가 하나도 없을 경우 컴파일러가 자동으로 추가

기본생성자는 반드시 작성하는 것이 좋다.

 

 

this

객체(인스턴스) 자기 자신을 의미

한 클래스 필드에서 여러 객체를 다루어야 하는데, 만약 여러 개의 객체가 접근한다면 어떤 객체가 필드에 접근하는지 알 수 없다. 그래서 this를 통해 필드에 접근한 객체가 누구인지 알려준다. 이때 접근한 객체가 가지고 있는 필드의 주소값을 this라는 변수에 담을 수 있으며 자동으로 담기게 된다. 또한 지역변수와 전역변수를 구별하는 용도도 있다.

 

 

클래스 예제

클래스와 메소드 생성 후 사용까지 예제

 

 

클래스 실습

728x90

1. 배열

배열

같은 자료형의 여러 변수를 하나의 묶음으로 나열해 놓은 것

- 여러 개의 저장공간을 배열을 통해 한 번에 선언하여 관리한다.

- 규칙성이 없는 값에 규칙성을 부여한다.(Index 번호 자동부여)

- [] 대괄호 사용

- 배열은 0부터 시작

 

1) 배열의 선언(배열을 다루기 위한 참조변수(배열명)가 선언만 된 상태)

자료형[] 배열명;

int[] arData;

 

2) 배열의 생성(실제 저장공간을 생성한 상태)

배열의 이름 = new 자료형 [칸 수];

arData = new int[5]

>> 배열을 선언하고 생성하는 과정. 선언과 생성을 동시에도 가능하다.

>> 자료형[] 배열명 = new 자료형[칸 수];

     int [] arData = new int [5]; > arData라는 배열에 5칸짜리 저장공간 생성된다. 값이 없는 빈 저장공간이다.

                                               > new 연산자가 반환한 주소값(배열에 부여되는 고유값)이 arData에 부여된다(ex.0x100)

                                               > 또한 각 배열의 요소에 번호가 자동으로 붙는다. > 배열의 인덱스 번호

 

3) 배열의 초기화

자료형[] 배열명 = {값1, 값2, 값3, 값4, ...}; > 선언과 생성, 초기화까지 한 번에 가능

int[] arData = {1, 2, 3, 4, 5}; > 5칸짜리 저장공간이 생성되면서 값까지 부여된다.

4) 배열의 사용

배열명[index] = 값;

System.out.println(배열명[index]);

arData[2]   // 3

 

 

예제

arData2.length = arData2 배열의 저장공간 수(길이) = 7

 

 

length

배열의 길이 구하기

배열명.length > 정수

배열을 선언하면, length라는 상수(변하지 않는 값)가 선언되어 배열의 길이가 담긴다. 따라서 배열의 길이는 한 번 선언하면 실행되는 동안 바꿀 수 없다.(만약 배열의 공간이 부족할 경우 더 큰 배열을 만들어서 기존의 배열을 복사해야 한다.)

 


 

2. 2차원 배열

2차원 배열

배열 안의 배열(가로 행, 세로 열)

1차원 배열의 배열(1차원 배열 여러 개를 하나로 묶어 놓은 것)

 

자료형[][] 배열명 = new 자료형[행][열];

int[][] number = new int [2][3];   // 2행 3열의 배열

number[0][0] | number[0][1] | number[0][2]

number[1][0] | number[1][1] | number[1][2]

- 2차원 배열에서 첫 번째 대괄호로 접근한 행들은 주소값이 되고, 두 번째 대괄호로 접근하는 열들이 값이 된다.

- arrData.length는 행을 나타내고, 열의 길이는 arrData[행의 index].length

- ex. arrData.length > 2 / arrData[0].length > 3

- 1차원 배열을 여러 개 선언할 때 관리하기 힘들기 때문에, 2차원 배열을 한 번에 선언한다.

- 하지만 2차원 배열은 메모리 낭비가 심하므로 선호하지 않는 편이다.

 

 

2차원 배열 선언

자료형[][] 배열 = {

{값1, 값2, 값3, ...},

{값1, 값2, 값3, ...},

.

.

.

};

int[][] arrData = {

{10, 20, 30},

{40, 50, 60}

};

- 각각 소배열들은 행을 나타내고, 그 안에 값들의 방 번호는 열을 나타낸다.

- 2차원 배열을 사용할 때에는 두 번 접근 해야하기 때문에 대괄호가 두 개이다.

 

 

2차원 배열 예제

- 2행 3열 배열 생성(초기화) 후 1행 3번째 값([0][2]) 출력 > 30

- for문으로 arrData에 있는 수 전체 출력. 총 6개이므로 6번 반복하도록 세팅.

  [i/3] > 0/3=0, 1/3=0, 2/3=0, 3/3=1, 4/3=1, 5/3=1 > 0 세 번, 1 세 번

  [i%3] > 0/3=0, 1/3=1, 2/3=2, 3/3=0, 4/3=1, 5/3=2 > 0, 1, 2 반복

  따라서 [0][0], [0][1], [0][2], [1][0], [1][1], [1][2] 배열의 모든 항목이 출력된다.

 


 

3. 중첩 for문

중첩 for문

for문 안에 for문이 있는 형태

바깥쪽에 있는 i for문은 다음 반복으로 넘어가기 위해서 안쪽 for문의 모든 문장을 마쳐야 한다.

안쪽의 j for문이 모두 완료되어야 바깥의 i for문 입장에서는 한 회 반복한 것이다.

1 회 반복시 i 값이 변하며 다음 반복으로 넘어가게 된다.

안쪽 for문의 반복횟수는 (i for문 반복횟수)

 

ex.

for(Int i=0; i<3; i++){

          반복할 문장

          for(int j=0; j<3; j++){

          반복할 문장

          }

바깥 for문 0일때 안쪽 0, 1, 2 반복

바깥 for문 1일때 안쪽 0, 1, 2 반복

바깥 for문 2일때 안쪽 0, 1, 2 반복

> 안쪽에 있는 for문은 총 3개(i)*3개(j) 총 9번 실행된다.

 

중첩 for문 예제

- i가 0일 때 j 0, 1, 2, 3, 4, i가 1일 때 j 0, 1, 2, 3, 4, 이런 식으로 i가 4가 될 때까지 반복되어 출력된다.

- 앞선 2차원 배열 예제처럼 배열 안 모든 수를 출력하는 예제를 중첩 for문을 이용할 수 있다.

  arrData.length는 arrData의 행의 인덱스 범위 > 0, 1

  arrData[i].length 는 arrData의 특정 행의 열의 인덱스 범위 > 0, 1, 2

 


 

배열 처음 들었을 땐 무슨 얘긴가 싶었는데 정리를 하다보니 이해가 되는 것 같기도 하공...

배열에 수를 넣는 방법을 다양하게 할 수 있는 것 같아서 공부를 좀 더 해봐야겠다.

728x90

+ Recent posts