13. 다차원 배열 - 2차원 배열 (2차원배열에 랜덤정수 넣고 출력) [ Tutorial 13]
배열이 배열의 원소에 들어가는 구조로, 이차원 배열은 M X N 구조를 가진다.
a[0][0] a[0][1] ...
a[1][0] a[1][1] ...
로 앞[]에 배열이 행, 뒤에 배열[]이 열을 의미한다.
그냥 단순배열 a[]에서는 열을 의미한다고 생각한다.
[1] 50 X 50의 이차원배열에 0~9사이의 랜덤 정수를 생성해서 전체 데이터를 분석해보자
1. 배열크기를 의미하는 상수하나를 선언한다.
int N = 50;
2. int형 2차원 배열을 선언하고, 1에서 만든 상수를 배열의 크기에 집어넣는다.
int[][] array= new int[N][N];
3. 2차원 배열을 처리할 때는, 이중 for문 (중첩 for문)을 사용한다. ( 행 > 열 순서로 for문 순서를 지정한다.)
index 0번째 행에서--> 0~49까지 각 열이 채워준다. 그걸 50번 반복
4. 이제 0부터 9까지 사이의 랜덤한 수를 배열에 집어넣는다 ( 랜덤 수 0<= x<1 에 10을 곱해서 0<=x<10 을 정수형으로)
for(int i = 0; i<N ; i++) {
for(int j = 0; j<N ;j++) {
array[i][j] = (int)(Math.random() * 10 );
}
}
5. 이제 집어넣은 50 X 50 2차원 배열을 출력할 때도 이중 FOR문을 써야한다.
(1) 열에 있어서는, print 로 배열[i][j] + " "; 로 빈칸을 두도록 출력하고
(2) 행에 있어서는, println으로 한줄씩 내려가도록 만든다.
** 이차원 배열은 2d게임의 좌표설명 / 미로찾기 등을 개발할 때 많이 사용된다.
public class Main {
public static void main(String[] args) {
int N = 50;
int[][] array= new int[N][N];
for(int i = 0; i<N ; i++) {
for(int j = 0; j<N ;j++) {
array[i][j] = (int)(Math.random() * 10 );
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N ; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}
'Java > 기초 튜토리얼' 카테고리의 다른 글
5. 클래스, 생성자, Overloading, this, 접근제한자, 소유제한자, 객체, JVM메모리구조 [ javase06 ]
단축키)
[syso] 치고 + [ctrl + space] : 출력문 자동완성
[Ctrl+Alt+아래 화살표 ] : 한줄복사.
1. 클래스(Class)의 구조
패키지 선언 >
import구문(java.lang.* 패키지 안에 것들은 생략되어있음) >
접근제한자 (public ~) > 클래스 선언 > extends Object(생략, 자바계층구조도의 최상위는 Object) > 인터페이스 implement >
필드or멤버변수 >
생성자 >
매쏘드
2. 생성자(Constructor)
- 생성자 : 객체 생성시 호출이 된다.(new 생성자( 생성자의 파라미터)). 메소드와 형식이 비슷하지만, [이름이 클래스명과 같고 ] [리턴타입이 없다]
생성자를 통해서, 클래스안의 필드들에 기본값을 넣어준다.
- 기본생성자(default constructor) : 클래스의 접근제한자와 이름이 같은 것을 가지고, 인자값(파라미터, 매개변수)가 아무것도 없는 생성자.
만약 생성자가 하나도 없으면, 컴파일러가 자동으로 기본생성자를 만들어준다.
//생성자 생성 [Ctrl + Space]로 default 생성자를 바로 생성할 수 있다.
//default 생성자. 클래스와 똑같은 public이라는 접근제한자를 가진다.
public Car() {
}
//직접 생성자 생성. 접근제한자는 클래스의 접근제한자와 동일하게 해주는 것이 좋다. 파라미터를 추가했다.
public Car(String owner) {
this.owner = owner; //받은 파라미터를 클래스의 멤버변수(필드)에 대입하려면 this.멤버변수(필드) 에 대입한다.
//다른 방식으로서, 인자를 2개를 가지고 있지 않더라도,인자 1개의 생성자라도 임의의 값을 넣어서 인자 2개인 생성자를 호출할 수 있다.
//this("임의의색으로 다른 생성자 호출", owner);
}
//생성자 오버로딩을 이용해서, 파라미터를 더 추가했다.
public Car(String color, String owner) {
this.color = color;
this.owner = owner;
}
3. 오버로딩(Overloading)
- 메소드 혹은 생성자와 같은 이름을 가지나, 인자(파라미터, 매개변수)의 형태나 갯수, 순서가 달라서, 완전히 다른 것으로 인식 되는 것.
- 개발의 편의성을 위해 존재한다.
//생성자 오버로딩을 이용해서, 파라미터를 더 추가했다.
public Car(String color, String owner) {
this.color = color;
this.owner = owner;
}
4. this(예약어) - 파라미터로 넘어온 것을, 클래스의 것인 필드(멤버변수)에 대입할 수 있다.
- 현재 객체의 참조형으로, 예를 들어
public class Point {
private int x, y; //필드(멤버변수) 2개.
//4개의 생성자가 오버로딩 되어있다.
public Point(int x, int y){ // 1. 파라미터로 넘어온 x를 --> 클래스안의 필드(멤버변수)에다가 집어넣고 싶을 땐, this.x 에 집어 넣는다.
클래스안에서 기본값을 넣어준다.
this.x = x; // 즉, 클래스의 x를 this.x <--> 파라미터로 넘어온 것은 그냥 x
this.y = y;
}
public Point(){ // 2. 클래스명과 동일한 접근제한자+이름 을 가진다. 인자(파라미터)에는 아무것도 없으니, 기본 생성자다.
this(0, 0); // 이때, 이 2번 기본생성자의 this(0,0)는 --> 파라미터가 2개인 1번 생성자 class Point(int x, int y)를 호출해서 x와 y에다가 0,0을 넣어주게 된다.
}
public Point(int x){
this(x,0);
}
public Point(int y){
this(0,y);
}
}
5. 접근 제한자(Access Modifier)
- 클래스, 멤버변수, 메소드, 인터페이스 등에 붙어서 접근가능여부(사용여부)를 알려주는 예약어 이다.
- public > protected > default > private 순으로 범위가 좁아진다
(1) private : 클래스 안에서 선언되면, [같은 클래스 안]에서만 쓰인다.
(2) default : 접근제한자가 없는 것으로, 클래스의 안에서 선언되도, [패키지 안]의 어느 클래스에서나 사용가능하다.
(3) protected : default보다는 넓은 범위로, 한 패키지내에서 다른 클래스가 다 사용가능하고 + [ 다른패키지라도 자식클래스(subclass) ]라면 사용가능한 것이다.
(4) public : [ 제한 없는 것], 다른 컴퓨터에서도 네트워크로도 접근가능하다. 네트워크프로그래밍에서는 필수
*** 마땅한 이유가 없으면 필드(멤버변수)는 반드시 private로 선언하는 것이 좋다.
*** 상수(final)이 아닌 경우에는 public을 쓰지 않는 것이 좋다.
6. 소유제한자(Static)
- 클래스내부의 메소드나 변수 앞에 붙어서 [누구의 것인지]를 나타낸다.
ex> String s; --> 생성된 각 [객체]의 것, ===> 메인함수에서, 객체.변수명으로 사용
static String s; --> [클래스]의 것 ===> 메인함수에서, 클래스명.변수명으로 사용 && 어느 객체의 객체.변수명으로도 접근이 가능하나, 클래스에 저장된다.
- static이 붙어 있으면 클래스의 것으로, 객체.를 이용해서 사용하는 것이 아니라, 클래스.을 이용해서 사용하는 것이 좋다.
***여러개의 어느 객체에서든 객체.변수명에 새로운 값을 대입하면, 클래스의 것인 static 변수가 바뀐다. 그러나 정식으로 접근하는 것은 아니다.***
- static final의 형태로, 상수값 선언할 때 사용한다. (클래스의 단 하나의 것이면서, 안움직이게!)
public class Car{
Stirng color; // static 없으니 객체의 것(객체를 선언해서 거기서 사용) --> Car1.color, Car2.color
static String modelName; // static 있으니 클래스의 것(클래스 내부에서만 저장) --> Car.modelName / Car1.modelName도 가능하긴함
static int maxSpeed = 300;
}
..
public class Car {
public static int height;//static을 붙혔으니, 메인함수에서, 객체없이 [Car.변수명]으로 바로 쓸 수 있다.
}
public static void main(String[] args) {
Car.height = 100; // Car의 객체 car 생성 없이도, 바로 쓸 수 있는, 클래스의 것인 static 변수
...
//객체에서 height 값을 주지 않았으나, 클래스의 것인 static변수 height는 , 어느 객체에서든 --> 클래스의 static 변수로 접근이 가능하며, 클래스내부 1개의 값만 호출한다. 그러나 객체를 통한 접근은 정식접근이 아니다.
System.out.println(c1.height);
//c1에서 클래스의 것인 static변수 height에 값을 대입하면, c2에서 접근하더라도 클래스의 것인 height는 입력한 값이 출력된다.
c1.height=200;
System.out.println(c2.height);
System.out.println(Car.height);
}
---출력값--------------------
100
200
200
------------------------------
7. 객체 생성과 사용
- new 라는 예약어와 생성자를 호출하여( new Object()) ---> ReferenceType변수(참조형 변수, 클래스명)에 대입을 하는 것이다.
Object o = new Object();
- 한 클래스 안에 , 다른 클래스의 객체를 , 필드로 가지고 있는 경우 : has a 관계
public class Wheel{
int radius; // 반지름을 필드로 가지는 Wheel클래스
}
public class Car{
Wheel wheel; // Wheel클래스의 객체를, 필드로 가지는 Car클래스
String meodel;
}
- 이때, Car는 Wheel을 가지고 있는 has a 관계이다.
- 이것을 메인함수에서 사용해보면,
Car c = new Car();
Wheel w = new Wheel(); //w에 객체를 생성함
c.wheel = w; // 생성된 객체를 같은 타입의 c.wheel에다가 대입해주니, c.wheel에는 Wheel객체인 w가 참조됨
c.wheel.radius = 100;
> 객체지향의 특징으로, c는 Car의 객체로서, wheel이라는 Wheel의 참조형변수를 가지고 있다(아직 객체 생성은 안됬다). 거기다가 new생성자를 호출해서 객체를 생성한 w를 대입해주면, c.wheel에는 w객체를 참조하게된다. c.wheel이라는 객체는 Wheel의 객체와 같으므로, radius라는 필드를 가지니, 거기다 100을 대입했다.
> 이때, c.wheel.radius =100;과 w.radius=100;은 똑같다. w 자체가 c.wheel에 담겨 있으므로, w에 대입해주나 c.wheel에 대입해주나 같이 c. 안에 들어가게 된다. ( 객체지향으로, w는 c.wheel담겨져 참조된다. w에 대입해도 c.wheel 안에 들어가게 된다 )
8. JVM메모리의 구조
- Method area / Stack Area / Heap Area로 구분된다.
(1) Method Area : class에 관련된 정보들이 저장된다. (static 등..)
(2) Stack Area : 매쏘드가 실행이되는 부분(main())에서 사용되는 변수들이 저장된다.
(3) Heap Area : 각 객체가 new Car(); 으로 만들어 질 때, 각 객체들의 정보가 저장된다.
Stack Area에서 Car a = new Car();로 변수에 참조를 할 때, 여기의 객체정보들이 쌓여서 참조된다.
각 객체는 HeapArea에서 hashCode를 가지고, StackArea의 각 변수들이 이 hashCode들을 참조하고 있다.
//객체를 출력해보면, 속한 패키지. 클래스명 @ 해쉬코드가 찍힌다.
System.out.println(c1);
System.out.println(c2);
//c2를 c1에 대입하면, heap area의 c2에 연결되던 new Car() 객체 정보가 -> Stack Area의 변수 c1과 연결되서 , 기존 c2와의 연결은 끊어진다.
c1 = c2;
System.out.println(c2);
----
classa.Car@7852e922
classa.Car@4e25154f
classa.Car@4e25154f
---------------------
9. 실습
public class Car {
private String owner;
String name; //접근제한자 default
protected String color;
public static int height;//static을 붙혔으니, 메인함수에서, 객체없이 [Car.변수명]으로 바로 쓸 수 있다.
//생성자 생성 [Ctrl + Space]로 default 생성자를 바로 생성할 수 있다.
//default 생성자. 클래스와 똑같은 public이라는 접근제한자를 가진다.
public Car() {
}
//직접 생성자 생성. 접근제한자는 클래스의 접근제한자와 동일하게 해주는 것이 좋다.
public Car(String owner) {
this.owner = owner; //클래스의 멤버변수(필드)에 대입하려면 this.멤버변수(필드) 에 대입한다.
//다른 방식으로서, 인자를 2개를 가지고 있지 않더라도,인자 1개의 생성자라도 임의의 값을 넣어서 인자 2개인 생성자를 호출할 수 있다.
//this("임의의색으로 다른 생성자 호출", owner);
}
//생성자 오버로딩을 이용해서, 파라미터를 더 추가했다.
public Car(String color, String owner) {
this.color = color;
this.owner = owner;
}
public static void main(String[] args) {
Car.height = 100; // Car의 객체 car 생성 없이도, 바로 쓸 수 있는, 클래스의 것인 static 변수
Car c1 = new Car();
c1.name = "조재성 카";
//생성자를 이용한 객체 생성. ()안에 ctrl+space로 고를 수 있다.
Car c2 = new Car("조재성");
c2.name = "조재성 카2";
//syso + Ctrl+space를 하면 자동완성된다.!
//객체어서 height 값을 주지 않았으나, 클래스의 것인 static height는 , 어느 객체에서든 --> 클래스의 static 변수로 접근이 가능하다.
System.out.println(c1.height);
//c1에서 클래스의 것인 static변수 height에 값을 대입하면, c2에서 접근하더라도 클래스의 것인 height는 입력한 값이 출력된다.
c1.height=200;
System.out.println(c2.height);
System.out.println(Car.height);
//클래스의 것은, 객체 어디서든 접근가능하나
//객체의 것인, 필드들은, 각각 다르다.
System.out.println(c1.name);
System.out.println(c2.name);
System.out.println(c1.owner);
System.out.println(c2.owner); //c2는 생성자를 통해 각 객체의 것인 필드값에, 소유자를 적어서 생성했으니, null이 안뜬다.
//객체를 출력해보면, 속한 패키지. 클래스명 @ 해쉬코드가 찍힌다.
System.out.println(c1);
System.out.println(c2);
//c2를 c1에 대입하면, heap area의 c2에 연결되던 Car 객체 정보가 -> Stack Area의 변수 c1과 연결되서 , 기존 c2와의 연결은 끊어진다.
c1 = c2;
System.out.println(c2);
}
}
'Java > 심화 개념설명' 카테고리의 다른 글
7. enum, 가변형 인자, 추상 클래스(abstract class), 중첩 클래스(nested class), annotation, final [javase08] (0) | 2018.02.21 |
---|---|
6. 인터페이스(상세), JavaDoc, 상속, 형변환, 오버라이딩, 다형성, super(생성자/오버라이딩) [javase07] (0) | 2018.02.20 |
4. 변수의 종류와 배열(Array) [프로젝트 : javase05] (0) | 2018.02.18 |
3. 인터페이스 & 패키지 와 API의 개념 (0) | 2018.02.08 |
2. 데이터 캡슐화 & 상속 & 이클립스 폰트 바꾸기 (0) | 2018.02.08 |
12. 배열(Array) (입력받은 배열의 최대값/ 100개의 랜덤 정수의 평균) [ Tutorial12 ]
참고) [ Ctrl + Shift+ O ] : import 단축키
배열의 선언방법
int[] array = new int[100];
- 여기서 new라는 것은 어떠한 인스턴스를 만들 때 쓰는 약속 예약어이다.
- 대괄호[]로 배열을 선언하고, 배열의 크기를 우항에 넣는다.
- 변수 array에는 100개의 배열을 가진다.
- index라는 것은 0부터 출발해서, 99까지 차지한다. (크기 -1까지)
[1] 원하는 개수만큼 배열을 생성 하고, 입력한 다음, 최대값을 구하는 프로그램을 작성해보자.
1. 최대값을 반환하는 max()매쏘드를 하나 만들어준다.
public static int max(int a, int b) {
return a>b?a : b;
}
2. 메인함수 안에 Scanner 를 선언한다. sc를 이용해서 사용자에게 배열의 크기를 입력받을 것이다. print도 찍어준다.
3. sc를 이용해서 정수를 받고, int number에 입력 받는다. 입력받을 변수를 이용해서 배열을 만든다.
4. for문을 통해 0부터 number-1까지 1씩 증가시키면서 index값으로서 사용하며, for문 안에서는 배열을 입력받고 그것을 배열안에 넣어준다.
5. int result =-1;을 선언하고, for문을 돌리면서, max()함수를 이용해 최대값이 들어가는 result 와 각 배열 index[0]부터 [number-1]까지 최대값을 비교해서 result에 집어넣어준다.
6. 최대값 result를 출력한다.
import java.util.Scanner;
public class Main {
public static int max(int a, int b) {
return a>b?a : b;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("생성할 배열의 크기를 입력하세요 : ");
int number = sc.nextInt();
int[] array = new int[number];
for(int i = 0; i <number ;i++) {
System.out.print("index["+i+"]"+"번째 배열에 넣을 값을 입력해주세요(양수) : ");
array[i] = sc.nextInt();
}
int result = -1;
for (int i = 0; i<number ; i++) {
result=max(result, array[i]);
}
System.out.println("배열 중 최대값 : "+result);
}
}
7. 출력값
생성할 배열의 크기를 입력하세요 : 5
index[0]번째 배열에 넣을 값을 입력해주세요(양수) : 1
index[1]번째 배열에 넣을 값을 입력해주세요(양수) : 10
index[2]번째 배열에 넣을 값을 입력해주세요(양수) : 54
index[3]번째 배열에 넣을 값을 입력해주세요(양수) : 3
index[4]번째 배열에 넣을 값을 입력해주세요(양수) : 2
배열 중 최대값 : 54
[2] 100개의 랜덤 정수의 평균을 구하는 프로그램을 작성해보자.
1. 100개짜리 배열을 선언하고, for문에는 index만큼 0부터 99까지 돌린다.
2. 각 배열[index]마다, Math.random() * 100 + 1 을 넣어준다. 이 때 double이므로, int로 캐스팅 해야한다.
이때, Math.random()은 0 <= x < 1 사이의 랜덤한 수를 가져오기 때문에, 100을 곱해서 0<= 100x< 100 가 되고, +1을 더해서 1<=x<101 이게 된다. 이제 형변환으로 정수가 나오게 된다.
3. for문을 돌려서 array[i] 100개를 모두 sum에 넣은 뒤에, 그 값을 출력해준다.
int[] array= new int[100];
for(int i = 0;i<100;i++) {
array[i] = (int) (Math.random() * 100 + 1);
}
int sum = 0;
for(int i = 0; i<100;i++) {
sum+=array[i];
}
System.out.println("100개의 랜덤 정수의 평균 : "+ sum/100);;
}
'Java > 기초 튜토리얼' 카테고리의 다른 글
10~11. 반복함수와 재귀함수(팩토리얼 / 피보나치 수열) ) [프로젝트명 : Tutorial10, 11]
9. 반복함수와 재귀함수(팩토리얼/ 피보나치 수열) ( Tutorial10, 11)
반복함수는 while 혹은 for문법을 이용해서 문제를 해결하는 함수다.
재귀함수는 자신의 함수 내부에서 자기 자신을 스스로 호출함으로써 재귀적으로 문제를 해결하는 함수다.
(Tutorial10)
[1] 반복함수로 팩토리얼을 구현해보자
1. int를 하나 받아서 int를 반환하는 팩토리얼 함수를 만들자.
- 로컬 변수 sum에 1을 넣어 초기화 한 다음, for문을 통해서 sum에다가 2부터 i를 받은 숫자까지 곱해서 넣어주자.
//5! = 5 * 4 * 3 * 2 * 1
public static int factorial(int number) {
int sum = 1;
for ( int i = 2; i<=number ; i++) {
sum *= i;
}
return sum;
}
2. 메인함수에서 출력시켜보자
public static void main(String[] args) {
System.out.println("10팩토리얼은 "+factorial(10)+ "입니다.");
}
[2] 재귀함수로 팩토리얼을 구현해보자.
1. 받은 값이 1일 때만 예외적으로, 1을 return해서 마무리 짓는다.
왜냐하면, 속에 똑같은 매쏘드()가 들어가는데, -1씩 줄여서 대입할 것이기 때문에, 마지막 1은 바로 1을 리턴하도록 한다
재귀함수는 계속 자신을 호출하므로, 마지막에는 상수로 마무리대응 해야한다.
2. return할 때, 받은 수 * 매쏘드( 받은수 -1 ); 을 반환해서, 받은수 -1 이 또 한바퀴 돌도록 한다. 1이 되면 그냥 1이 return되서 끝난다.
- 핵심은 -1 씩 줄여가다가 마지막 종점 1에서는 재귀함수를 호출 안하고, 값 1을 반환해서 끝낸다.
- 핵심은 5! = 5 * 4!로 같으며, 팩토리얼 속에 또 -1의 팩토리얼이 담겨져 있으니까, 재귀함수로 표현 가능하다.
f(5) = 5 * f(4)
//5! = 5 * 4!
public static int factorial(int number) {
if(number ==1)
return 1;
else
return number * factorial(number-1);
}
(Tutorial11)
[3] 반복함수로 피보나치 수열을 구현해보자.
- 피보나치 수열은 연속된 두 수를 더해서 다음 수가 나오는 수열을 말한다.(// 1, 1, 2, 3, 5, 8, ...)
- k번 째 수가 무엇인지 알아내는 함수를 만들 것이다.
1. 첫째항 1과 둘째항 1을 미리 선언해준다. 잘못된 경우에 -1을 반환하도록 result도 만들어준다.
(피보나치수열은 초기항 a1, a2는 기본적으로 주어진다)
2. if /else if 에다가는 첫째항, 둘째항이 입력되면 바로 반환하도록 만들고 / 나머지 3번째항 이상인 경우 else에다가 아래와 같이 코드를 작성해야한다.
- for문 2 <= i < number 까지 돌면서,
<2부터 시작하는 이유는, number가 3이라고 가정해보면, i=2일때만 for문이 작동하므로 a1 + a2 만 계산한 a3가 리턴된다
만약 number가 4라면, i=2일 때 다음계산을 위해, a2가 one에 / a3가 two에 들어가고, 마지막 i=3이면 a2+ a3 가 result에 담겨서 리턴되기 때문>
i = 2 일때, 초기항 2개를 더해서 result에 넣어준다. (one + two)
다음계산을 위해서, one에다가는 오른쪽으로 한칸 옮겨지므로, two를 대입해준다
two에다가는 오른족으로 한칸 옮겨지므로, one+two값인 result를 넣어준다.
i = 3 일때, 미리 옮겨진 one 과 two를 더해서 result에 더한다. 그리고 오른쪽으로 한칸씩 one과 two를 옮긴 값을 대입해 놓는다.
...
i=number-1 일때, number항 직전 2개의 항인 one과 two를 더해서 result에 넣는다. 그리고 다음계산을 위해 오른쪽으로 옮겨놓지만 사용되진 않음.
public static int fibonacci(int number) {
int one=1;
int two=1;
int result = -1;
if(number == 1)
{
return one;
}
else if(number == 2) {
return two;
}
else{
for(int i = 2; i < number ; i++) {
result = one + two; // number 직전까지 아래에서 one과 two를 옮겨놓았다.
one = two; // 수열 오른쪽으로 한칸씩 다음 계산을 위해, 옮겨놓는 작업.
two = result;
}
return result;
}
}
3. 출력해보자.
public static void main(String[] args) {
System.out.println("피보나치 수열의 10번째 원소는 "+fibonacci(10)+"입니다.");
}
[4] 재귀함수로 피보나치 수열을 구현해보자. 훨씬 간단해진다.
- 핵심은 n-1씩 해가면서, 줄여가는 것이다. 그리고 마지막 종점지에는 상수를 이용해서 리턴해줘야한다.
- 팩토리얼 함수와 차이점은 n-1뿐만 아니라 n-2도 있으니, 2개의 초기항이 존재해야한다.
1. 첫번째, 2번째 항에 대해서는 if문으로 바로 return1을 해주자.
2. 3번재 이상부터는, return값에 f(n-2) + f(n-1)만 해주면 된다.
public static int fibonacci(int number) {
if(number ==1)
{
return 1;
}else if(number==2) {
return 1;
}else {
return fibonacci(number-2) + fibonacci(number-1) ;
}
}
*** 반복함수와 달리 재귀함수의 피보나치 수열은 f(49) 계산시, f(48) + f(47)이 계산되지만,
f(48)계산시에도 f(47) + f(46)이 계산되므로, 반복되는 계산이 기하급수적으로 많아 진다.
재귀함수를 사용할 때, 훨씬 비효율적인 계산을 하므로, 주의해서 계산해야한다. 실제로 f(50)을 물어보면, 계산값이 안나온다.
'Java > 기초 튜토리얼' 카테고리의 다른 글
13. 다차원 배열 - 2차원 배열 (2차원배열에 랜덤정수 넣고 출력) [ Tutorial 13] (0) | 2018.02.20 |
---|---|
12. 배열(Array) (입력받은 배열의 최대값/ 100개의 랜덤 정수의 평균) [ Tutorial12 ] (0) | 2018.02.19 |
8~9. 사용자 정의 함수(최대공약수/ k번째 약수/ 마지막문자 뽑기/ 최대값) [프로젝트명 : Tutorial8, 9] (0) | 2018.02.18 |
7. 기본 입출력 / 파일 입출력 (Scanner/file 입출력) [프로젝트명 : Tutorial7] (0) | 2018.02.18 |
5~6. 조건문 & 반복문(contains/점수조건/equals/합/삼각형/원 만들기) [프로젝트명 : Tutorial5, 6] (0) | 2018.02.08 |
4. 변수의 종류와 배열(Array) [프로젝트 : javase05]
[1]변수(Variable)
변수의 분류 - 객체 변수/ 클래스변수 / 지역변수/ 인자형 변수 or 참조형 변수 / 기본형 변수
1. 객체형 변수 (Instance Variable) - non-static field
- 객체형 변수란 ? 클래스 안에 선언되어있는 변수로 [ 필드 혹은 멤버변수 ]라고 부른다.
- 필드의 종류도 2가지가 있다. static이 붙어 있는 것과 static이 없는 것이다. 일반적으로 static이 안붙어 있는 것을 [ 필드 혹은 멤버변수 ]라고 한다.
- 클래스로 객체를 생성할 때마다, (객체.변수)로 사용할 수 있다.
2. 클래스 변수(Class Variable) - static field
- 클래스 변수란 ? 클래스 안에 선언되어 있으면서 static이 붙어 있는 변수로 [ 스태틱 필드 ] 라고 부른다.
- 클래스에만 하나가 존재하여 저장되는 변수로, 객체형변수와는 다르게, (클래스명.변수)로 사용하며,
생성된 여러 객체에서도 호출이 가능하나 (객체.변수) but 클래스 안에 하나의 형태로 저장된다.
3. 지역변수(Local Variable)
- 지역 변수란? 매쏘드()안에 존재하고 있기 때문에, 필드(클래스 안에 존재하는 변수)와 다르게, [반드시 초기화]를 해줘야한다.
- 멤버변수라 불리는 필드는 초기화가 필요없다. 자동으로 초기화가 된다. 그러나 매쏘드()안에 있는 변수는 반드시 초기화를 해줘야한다
4. 인자형 변수(Parameter)
- 인자형 변수란? 다른 언어에서는 argument라고도 불리며, 매쏘드()가 실행 될 때, 넘겨 받는 변수다.
5. 변수의 이름 붙이기(naming) - 식별자(identifier) 규칙
- 숫자로 시작할 수 없으나 영대 소문자나 숫자가 들어갈 수 있으며, 특수 문자 중 [ _ 와 $ ]를 넣을 수 있다.
- 관례(convention) : 소문자로 시작하며, $는 사용하지 않으며, _를 쓸 경우에는 맨 앞에 잘 사용하지 않는다.
ex> String name; (O) String 5name&;(X) / int powerPoint; (O) int _name;(세모)
6. 형태(Type)에 따른 구분
(1) 참조형 변수(Reference Type Variable) : String name; Test t; Object o; 등 앞글자가 대문자로 시작하여, 내부에 클래스를 가지고 있다.
-> 필드와 매쏘드()가 사용 가능
(2) 기본형 변수(Primitive Type Vairable) : int a; float f; char c; 등 소문자로 시작하며, 내부 클래스가 없다. 객체에 속하지 않는 것들임.
[2] 기본형 변수(8)와 참조형 변수
(1) 수치형 변수(6) : 기본형 변수 8가지 중 6가지는 수치를 나타내는 것으로, byte/ short/ int/ long 등 정수형 변수 와
float/ double의 실수형 변수가 있다.
- 순서대로 1/2/4/8 byte 와 4/8byte의 크기를 가진다.
- bit가 0,1로 이루어져있는데, 1byte는 8bit로 bit가 8개 있으므로, 0000 0000 ~ 1111 1111으로 구성 된다.
- byte의 8자리 중 첫번째 bit는 [부호비트]로 0은 양수, 1은 음수를 의미한다. 나머지 7자리의 bit가 숫자를 구성하므로 범위를 따지면 [ -2^7부터 ~ (2^7-1) ]로, 0을 양수에서 -1로 차지한다.
ex> int는 4byte이므로, bit가 8 x 4 = 32 개 존재한다. 첫번재 부호비트를 제외하고 31자리의 bit가 숫자를 결정하므로, -2^31 ~ (2^31-1)의 범위를 가진다.
(2) 문자형 변수(char) : 문자 하나를 표현하는 것이다. 작은 따음표로 감싸서 문자 1개를 표현한다. ex>'가', 'a'
(3) 논리형 변수(boolean) : true or false를 의미한다.
(4)참조형 변수(String) : 문자의 집합로 큰 따옴표로 표시한다. "a가 b는 아니다"
- 기본형 변수들은 [기본값]을 가진다.
byte, short, int는 0 / long은 0L / float는 0.0f / double은 0.0d 가 기본값이다.
char는 '\u0000'의 유니코드 값을 기본값으로 가진다.
boolean은 false를 기본값으로 가진다.
- 모든 참조형 변수는 기본값이 null이다.
(5) 기본형 변수 표기법
- 10진수 표기법 int a = 10;
- 16진수 표기법(0x XXX형식으로 표기) : int a = 0xa; (a는 10을 의미한다)
cf) 16진수는 0부터 9, A(10) ~ F(15)까지 총 16가지의 문자로 숫자를 표현하는 것을 말한다.
- 2진수 표기법(0b XXXX형슥으로 표기) : int a = 0b1010;(1010은 2진수로 10을 의미한다.)
- 실수 일반 표기법 : double d = 123.4;
지수 일반 표기법 : double d = 1.234e2; (e2는 100을 곱하는 것을 의미한다. d에는 123.4가 들어간다)
- 문자 표기법 : char 는 ''; / String은 "";
- 유니코드(UTF-16) 표기법 : 모든 문자는 2byte로 표기가 가능하다. 한글 가 도 2byte이다. '가'의 유니코드 값은 AC00이라는 코드를 가진다. 이런 것들의 모임은 charSet이다.
char c= '\uAC00'; String s= "\uAC00";
- Escape Sequence(특수한 표기법, escape문자) :
\b (backspace), \t(tab), \n(line feed), \r(carriage return, 엔터키), \"(double quote, 쌍따옴표), \'(single quote,작은 따옴표), \\(back slash)
- 언더바(_)문자 사용(se7부터 적용) : 숫자의 시작or끝에는 쓸 수 없고, 중간에 넣어서 구분을 위해서 넣어준다. ex> 전화번호, 카드번호 등등
[3] 배열(array)
- 배열이란? 똑같은 형태의 변수들의 집합체로, 방번호가 붙은 호텔과 같은 개념이다.
int[] a= new int[6];식으로 선언한다. 마지막의 6은 6개의 방을 만들어라는 의미이다.
- 방 번호를 index라 하는데 0부터 시작한다. 0부터 5번방까지 총 6개(length)의 배열이 만들어진 것이다.
- int는 클래스x 대문자로시작x인 기본형 변수이므로, default값= 기본값을 0으로 다 가지고 있다. 만약 2번 방을 끄집어 내고 싶다면, 대괄호 a[2]로 끄집어 낸다.
(1) 생성법은 3가지가 있다
int[] a = new int[6]; - int뒤에 바로 []를 넣어서, 우항에는 방의 번호를 집어넣는다.
int []a = {1, 3, 4, 5, 6, 3}; - 변수앞에 바로 []를 넣어서, 우항에는 값을 집어 넣어, 방번호를 간접적으로 만든다.
int a[] = new int[]{1,2,3,4,5,6}; - 변수뒤에 바로 []를 넣어서, 빈방과 값을 동시에 집어넣는다.
(2) 2차원 배열
int[][] a = new int[2][2]; - int뒤에 넣어서, 2차원 방번호를 집어넣는다.
int[][] a = { {1,2}, {3,4}}; - int뒤에 넣어서, 중괄호를 이중으로 해서 값을 집어넣는다.
[4] 실습
javase05 자바프로젝트를 만들고, 패키지명은 var, 클래스명은 TestVar, 메인함수까지 포함해서 만든다.
package var;
public class TestVar {
//클래스 안에 적었으니, static이 안붙은 [ 필드(field) 혹은 멤버변수 혹은 객체가 쓰는 객체형 변수 ] 혹은 static이 붙어 있는 [클래스 변수]가 될 수 있다.
String name; //static이 안붙어 있으면, 객체가 쓰는 변수로 [쓰는 곳에서는 클래스 객체가 필요하다! 메인함수에서 객체를 만들어서 써야한다]
int height;
static int power=100;
public static void main(String[] args) {
//메인 함수 안에 적었으니, 지역변수(Local variable)이다.
byte b = 1;
short s = 4; //int를 제외하고 잘 안쓰는 byte, short는, 엄청 큰 배열일 경우 크기를 고려할 때 byte배열이나 short배열을 사용한다.
int i = 1000;
long l = 10000000000L; //int의 범위(20억)을 넘는 수를 짚어 넣을 수 있다. L을 안붙히면, int로 인식되서 오류가 뜬다.
float f =3.14f;
double d= 3.14;
char c = '가';
boolean boo = true;
String str = "조재성";
TestVar t = new TestVar();
System.out.println(t.name); //클래스의 객체형 변수, 필드, 멤버변수는 초기화 안해두 null이라는 값으로 자동초기화 되어있다
String name;
System.out.println(name); //메쏘드 안의 지역변수는 , 초기화 하지 않으면, 오류가 뜬다. 지역변수는 반드시 초기화를 해야한다.
String name2="";
System.out.println(name2); //지역변수는, 문자형변수라면 "";로 초기화 해야한다.
}
}
'Java > 심화 개념설명' 카테고리의 다른 글
6. 인터페이스(상세), JavaDoc, 상속, 형변환, 오버라이딩, 다형성, super(생성자/오버라이딩) [javase07] (0) | 2018.02.20 |
---|---|
5. 클래스, 생성자, Overloading, this, 접근제한자, 소유제한자, 객체, JVM메모리구조 [ javase06 ] (0) | 2018.02.19 |
3. 인터페이스 & 패키지 와 API의 개념 (0) | 2018.02.08 |
2. 데이터 캡슐화 & 상속 & 이클립스 폰트 바꾸기 (0) | 2018.02.08 |
1. 객체지향프로그래밍(Object Oriented Programming) (0) | 2018.01.28 |