java 기초 복습하기
오늘은 제가 학교에서 (저번 학기때) 배운 객체지향 언어인 java를 (방학 기회를 노려서) 복습해보았습니다.
기본
public class java_learn {
public static void main(String[] args) {
System.out.println("hello world!");
출력을 할때 위와 같이 System.out.println이라고 작성합니다.
System.out.print는 개행을 안할 때 쓰입니다.
System.out.print("입력 : ");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
System.out.print("입력 : ");
System.out.println(i);
System.in으로 받는 Scanner 객체(scanner)를 생성하여 입력값을 i로 받습니다.
그리고 i를 출력합니다.
if(i<=1) {
System.out.println("음수입니다.");
}else if(i>=i) {
System.out.println("양수입니다.");
}
else {
System.out.println("0입니다.");
}
if문으로 괄호안에 특정 조건을 쓰며 사용할 수 있습니다.
switch (i) {
case 0:
System.out.println("hello, zero!");
break;
default:
break;
}
스위치문으로 정수를 구분하여 케이스별로 나눌 수 있습니다.
for(int j = 0;j<10;j++) {
System.out.println(j);
}
for문으로 조건부 반복할 수 있습니다.
(초기 값;조건;증가 혹은 증감)으로 사용합니다.
int array[] = {10,20,30,40};
System.out.println(array[0]);
int array_two[] = new int[5];
int array_three[][] = new int[5][5];
for(int k=0;k<array_two.length;k++) {
array_two[k] = k;
System.out.println(array_two[k]);
}
for (int l = 0; l < array_three.length; l++) {
for (int n = 0; n < array_three.length; n++) {
array_three[l][n]=l*n;
}
}
for (int m = 0; m < array_three.length; m++) {
for (int o = 0; o < array_three.length; o++) {
System.out.print(array_three[m][o]);
}
System.out.println("");
}
}
}
위와 같이 두가지 방식으로 배열을 생성할 수 있습니다.
만약 new로 선언하면서 생성하면 heap 메모리에 저장되어 가비지 컬렉션이 관리해줍니다. 그러므로, c언어 계열처럼 동적할당해도 따로 삭제하지 않아도 됩니다.
클래스
public class oop {
private int age;
private String name;
private int num;
public static int wallet = 1000;
우선 필요한 변수들을 선언합니다. 대부분 변수는 getter로 얻어갈 수 있으므로 굳이 public으로 열어둘 필요가 없습니다.
그리고, wallet은 static으로 선언하여 1000을 다른 객체들이 서로 공유하도록 합니다.
public static int getWallet() {
return wallet;
}
static이 부여된 변수를 리턴하려면 위와 같이 해야합니다.
protected int sum(int i,int j) {
int result;
result = i+j;
return result;
}
protected는 동일 패키지에 속하는 클래스와 상속 관계 클래스에서만 사용가능합니다.
public void GetInfo() {
System.out.println(name+age+num);
}
void로 리턴 값 없이 할 수 있습니다.
public oop() {
System.out.println("생성자 호출!");
}
public oop(String name,int age,int num) {
this.name= name;
this.age = age;
this.num = num;
System.out.println("생성자 호출!!");
}
생성자 오버로딩을 사용할 수 있으며, this을 이용해서 클래스 변수를 가리킬 수 있습니다.
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
getter와 setter로 private인 변수에 접근할 수 있습니다.
public class oop_two {
public static void main(String[] args) {
oop.wallet -= 100;
System.out.println(oop.getWallet());
oop.wallet -= 100;
System.out.println(oop.getWallet());
oop.wallet -= 100;
System.out.println(oop.getWallet());
oop.wallet -= 100;
System.out.println(oop.getWallet());
oop.wallet -= 100;
System.out.println(oop.getWallet());
}
}
static 변수로 선언한 내용은 객체를 생성할 필요없이 변수를 공유합니다.
패키지
package test_pack;
public class test {
private String testname;
public String getTestname() {
return testname;
}
public void setTestname(String testname) {
this.testname = testname;
}
}
import test_pack.*;
만약 타 패키지에 원하는 클래스나 변수가 있다면 import로 가져옵니다.
별표(*)로 전부 가져옵니다.
public class other_oop extends oop {
public static void main(String[] args) {
other_oop test_other = new other_oop();
System.out.println(test_other.getName());
}
}
extends로 상속해줄 수 있습니다.
위에서 name이라는 변수를 private으로 하고 getName을 하게되면 null값이 나오므로 접근 지정자는 적절히 조절해주셔야 합니다.
추상
public abstract class main {
public abstract void red_goods();
public abstract void blue_goods();
public abstract void green_goods();
public abstract void yellow_goods();
public abstract void black_goods();
}
그냥 선언만 하는 추상 클래스입니다.
추상 클래스에는 한개이상의 추상 메소드가 있습니다.
public class detail extends main{
@Override
public void black_goods() {
// TODO Auto-generated method stub
System.out.println("검은색 물건은 5000원입니다.");
}
}
상속받아서 구현합니다.
다만, 위와 같이 추상 메소드중에 구현되지 않은 것이 남아 있다면 오류가 납니다. 반드시 모두 구현해야합니다.
public class consumer {
public static void main(String[] args) {
detail user = new detail();
user.black_goods();
}
}
위에서 구현을 한 클래스로 객체를 만들어서 사용할 수 있습니다.
인터페이스
public interface root_file {
public static final int test_int = 10;
public void black_goods();
}
public class real_method implements root_file, root_file2 {
@Override
public void black_goods() {
System.out.println("검은색 실제 구현");
}
@Override
public void white_goods() {
System.out.println("하얀색 실제 구현");
}
}
인터페이스는 다중 상속이 가능하므로 위와 같이 구현할 수 있습니다.
public class main {
public static void main(String[] args) {
real_method test = new real_method();
test.black_goods();
test.white_goods();
root_file test_inter = new real_method();
test_inter.black_goods();
root_file2 test_inter2 = new real_method();
test_inter2.white_goods();
}
}
인터페이스를 타입으로 사용하여 구현된 메소드를 구분하여 작업할 수 있고, 반대로 타입을 통일시켜서도 사용 가능합니다.