자료구조
데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계
- 데이터 단위 : 데이터를 구성하는 한 덩어리
- 자료구조 : 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법
배열의 복제(클론)
배열 이름.clone() : 다차원 배열의 복제는 되지 않음
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
int[] a = {1,2,3,4,5};
int[] b = a.clone();
System.out.println(Arrays.toString(b));
}
}
주사
배열의 요소를 하나씩 차례로 살펴보는 과정
접근 제한자
객체의 맴버에 대한 접근을 제한할 때
- public : 모든 접근 허용
- protected : 같은 패키지의 객체, 상속 관계의 객체 허용
- default : 같은 패키지의 객체 허용
- private : 현제의 객체 안에서만 허용
난수
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
Random rand = new Random();
int a = rand.nextInt(90);
System.out.println(a);
}
}
의사 : 실제와 비슷하다는 뜻
컴퓨터에서 생성하는 난수는 진짜 난수가 아니다.
srand 메서드에 전달한 seed의 값과 컴퓨터 환경이 같다면 그 결과값은 항상 같다.
결국 컴퓨터에 의해 생성된 모든 난수는 미리 컴퓨터가 계산해 둔 의사난수이다.
배열 요소를 역순으로 정렬하기
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException{
int[] a = {1,2,3,4,5};
reverse(a);
System.out.println(Arrays.toString(a));
}
static void swap(int [] a, int idx1, int idx2) {
int t = a[idx1];
a[idx1] = a[idx2];
a[idx2] = t;
}
static void reverse(int[] a) {
for (int i =0; i < a.length / 2 ; i++) {
swap(a, i, a.length - i - 1);
}
}
}
기수 변환
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException{
int no = 59; //변환하는 정수
int cd = 16; //기수
int dno; //변환 후의 자릿수
char[] cno = new char[32]; //변환 후 각 자리의 숫자를 넣어두는 배열
dno = cardConvR(no, cd, cno);
for(int i = dno-1; i >=0; i--)
System.out.print(cno[i]);
}
static int cardConvR(int x, int r, char[] d) {
int digits = 0;
String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
do {
d[digits++] = dchar.charAt(x % r);
x /= r;
} while (x != 0);
return digits;
}
}
x가 59이고 r이 16이라면 x%r은 11이다
dchar.charAt(x%r)가 반환하는 것은 문자 B이다.
매서드 맨 앞에서 0으로 초기화하는 digits는 변환한 수의 자릿수를 나타내기 위한 변수이다.
do문 루프 본문에서는 다음 작업을 수행한다.
- x를 r로 나눈 나머지를 인덱스로 하는 문자를 배열 d의 요소 d[digits]에 대입하고 digits값을 증가시킨다.
- x를 r로 나눈다.
소수 구하기
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException{
int counter = 0; //곱셈과 나눗셈의 횟수
int ptr = 0; //찾은 소수의 개수
int[] prime = new int[500]; //소수를 저장하는 배열
prime[ptr++] = 2; //2는 소수
prime[ptr++] = 3; //3은 소수
for(int n = 5; n<= 1000; n+=2) {
boolean flag = false;
for (int i = 1; prime[i] * prime[i] <= n; i++) {
counter += 2;
if(n % prime[i] == 0) {
flag = true;
break;
}
}
if(!flag) {
prime[ptr++] = n;
counter++;
}
}
for(int i=0; i< ptr; i++)
System.out.println(prime[i]);
}
}
약수의 대칭성
5 * 20 과 20 * 5는 가로 세로가 다르지만 같은 직사각형이라고 말할 수 있다.
넓이가 100이라는 것은 직사각형의 어느 한 변으로 나눌 수 있다는 의미이다. 이러한 성질을 이용하여 제곱근을 한 변으로 하는 이후의 직사각형에 대한 계산량을 줄이는 것
즉 어떤 정수 n은 다음 조건을 만족하면 소수라고 판단할 수 있다.
- n의 제곱근 이하의 어떤 소수로도 나누어떨어지지 않습니다.
- prime[i]의 제곱이 n이하인가?
if문에서 flag가 true가 될 때 곱셈 prime[i] * prime[i]의 횟수는 이미 포함되므로 flag가 false일 때(n이 소수인 경우)만 counter를 증가시킨다.
클래스
임의의 데이터형을 자유로이 조합하여 만들 수 있는 자료구조
- 클래스 본체에서는 다음과 같은 내뇽을 선언할 수 있습니다.
- 맴버(필드/메서드/중첩클래스/중첩인터페이스
- 클래스 초기화 / 인스턴스 초기화
- 생성자
- 필드/메서드/생성자를 선언할 대 public/protected/private을 지정할 수 있습니다.
- 메서드/생성자는 다중으로 정의(오버로드)할 수 있습니다.
- final로 선언한 필드는 한 번만 값을 대입할 수 있습니다.
- 생성자는 새로 생성한 인스턴스의 초기화를 위해 사용됩니다.
(오버로드란 메서드나 생성자를 정의할 때 형식은 다르지만 같은 이름을 붙이는 것입니다.)
class A {
private int f1; //비공개 필드
protected int f2; //한정 공개 필드
public int f3; //공개 필드
static final int S1 = 0; //정적 상수 필드
public A() { //생성자
f1 = f2 = f3 = 0;
}
public A(int f1, int f2, int f3) { //생성자
this.f1 = f1;
this.f2 = f2;
this.f3 = f3;
}
public void setF1(int f) {
f1 = f;
}
public int getF1() {
return f1;
}
}