Java의 용어들과 예제 문제

문이빈·2023년 7월 19일
0

※ 카멜의 법칙

  1. 클래스명의 첫 글자는 대문자로 시작하고 나머지는 소문자로 작성하고 단어가 바뀌면 다시 첫 글자를 다시 대문자로 시작한다.
  2. 변수나 메소드의 첫 글자는 소문자로 시작하고 단어가 바뀌면 다시 첫 글자를 다시 대문자로 시작한다.
  3. 상수는 전부 대문자로 지정한다
  4. Java의 파일명은 반드시 클래스명과 동일해야 한다.
  5. 자바가상머신(JVM)이 가장 먼저 찾는 것은 public static void main(String[] args) 이다
    단, Servlet이 제일 먼저 찾는 것은 public void init()이다.
  6. 문장의 끝에는 반드시 ; 를 써야 한다.

switch

: 실수형 타입은 쓸 수 없다
: break 는 switch를 벗어나라

[형식]
switch(정수 or 문자 or 문자열 or 식) {
case 값1: break;
case 값2: break;
case 값3: break;
default :
}

반복문

  1. for

  2. while

  3. do~while

  4. for
    [형식]
    for(변수명=초기치; 조건치; 증감치){
    참일때
    }

  5. while
    [형식]
    while(조건){
    참일때
    }

  6. do~while
    [형식]
    do{
    참일때
    }while(조건);

break

: switch, 반복문(for, while, do~while)를 벗어날 때
: 자신이 소속된 곳 1번만 벗어난다.
: 만약에 2개 이상 벗어나려면 라벨을 사용 한다

continue

: 반복문(for, while, do~while)의 끝으로(}) 무조건 이동
: 자신이 소속된 끝으로(}) 무조건 이동
: 만약에 2개 이상 반복문 끝으로 이동하려면 라벨을 사용 한다

Array

  1. 동일한 자료형의 모임
  2. 연속적인 메모리 할당
  3. 첨자가 0부터 시작
  4. 한번 잡은 배열의 크기는 수정할 수 없다
  1. 1차원 배열
    [형식]
  • 자료형[] 배열명 = {값1, 값2,...};
  • 자료형[] 배열명;
    배열명 = new 자료형[개수];
  • 자료형[] 배열명 = new int[]{값1, 값2,...};

ex)
1. int[] ar = {10, 20, 30};
2. int[] ar;
ar = new int[3];
ar[0] = 10;
ar[1] = 20;
ar[2] = 30;
3. int[] ar = new int[]{10, 20, 30};
4. int[] ar = new int[3]{10, 20, 30}; - X
5. int[] ar;
ar = {10, 20, 30}; - X

  1. 다차원 배열
  • 생성할 때 행의 개수 꼭 써야 한다

가. 고정길이

  • 자료형[][] 배열명 = { {값1, 값2,...}, {값3, 값4,...}, {...},...};
  • 자료형[][] 배열명;
    배열명=new 자료형[개수][개수];

나. 가변길이

  • 자료형[][] 배열명;
    배열명 = new 자료형[개수][];
    배열명[0] = new 자료형[개수];
    배열명[1] = new 자료형[개수];
    배열명[2] = new 자료형[개수];

객체지향언어 - OOP(Object Oriented Programming)

: 모의실험을 목적으로 사용
: 실제 사물의 속성(데이터)과 기능(메소드)을 정의하여 가상세계를 구현
: 모의실험을 통해 많은 시간과 노력을 절감
: 객체지향이론은 캡슐화, 상속, 추상화 개념
: 코드의 재사용이 높다
: 유지보수가 용이하다
: 캡슐화, 상속, 다형성의 특징

클래스

객체를 정의한 것

[형식]

class   클래스명 {
    접근제한자 자료형 필드명;
    접근제한자 메소드() {
    }
    class Inner클래스명 {
    }
}

배열

아무 파일이나 다 받을 수 있어 - Object클래스

package class_;

public class SungJukMain2 {
	
	public static void main(String[] args) {

		SungJuk[] ar = new SungJuk[3]; // 객체 배열
		ar[0] = new SungJuk();
		ar[1] = new SungJuk();
		ar[2] = new SungJuk();
		
		ar[0].setData("홍길동", 96, 85, 78);
		ar[1].setData("코난", 100, 78, 55);
		ar[2].setData("라이언", 80, 76, 85);
		
		for(int i = 0; i<ar.length; i++) {
			System.out.println("객체 ar["+i+"] = "+ar[i]);
			ar[i].calcTot();
			ar[i].calcAvg();
			ar[i].calcGrade();
			System.out.println(ar[i].getName()+"\t"
			                  +ar[i].getKor()+"\t"
					          +ar[i].getEng()+"\t"
			                  +ar[i].getMath()+"\t"
					          +ar[i].getTot()+"\t"
			                  +String.format("%.2f",ar[i].getAvg())+"\t"
					          +ar[i].getGrade());
		}//for
		System.out.println("----------------------------------------------------");
		
		for(SungJuk data : ar) { // ar의 (배열) 크기만큼 for문을 반복합니다.
			data.calcTot();
			data.calcAvg();
			data.calcGrade();
			System.out.println(data.getName()+"\t"
			                  +data.getKor()+"\t"
					          +data.getEng()+"\t"
			                  +data.getMath()+"\t"
					          +data.getTot()+"\t"
			                  +String.format("%.2f",data.getAvg())+"\t"
					          +data.getGrade());
		}
	}
}

특징

  1. 캡슐화
  2. 상속성
  3. 다형성

Overload 메소드 Overloading

하나의 클래스 안에서 똑같은 이름의 메소드가 2개 이상 존재 할 때
인수(매개변수) 형이 틀리거나
인수(매개변수) 개수가 틀린 경우

class AA {
    public void sub(int a){}
}


class   BB{
    public void sub(int a){}
    public void sub(String a){}
    public void sub(char a){}
    public void sub(int a, int b){}
    public void sub(){}
    public int   sub(int a){}
}

생성자 (Constructor) 메소드

객체 초기화를 하기 위해서 (자바는 이미 초기화가 초기화되어 있음)

  1. 생성자명은 반드시 클래스명과 동일하다.

  2. 자동호출 - 클래스를 메모리에 생성 시(new 할때)

  3. returnType(결과형)이 없다.
    -> 앞에 아무것도 없음 (쓰지마, void도!)

  4. 클래스 안에 생성자가 하나도 없을 시에는 자동으로 기본(default) 생성자 호출
    기본 생성자 - 인수가 없는 메소드

    	private int a; - 생성자 setter
    
        public void setA(int a){
    
        }
        1번 public Test(int a){
    
        }
        2번 public Test( ){ } <- 기본 생성자
    
        Test t = new Test(숫자) - 1번
        Test t = new Test( ) - 2번

return 형 메소드명(인수형 인수, 인수형 인수,.....)

ex)
int sub(int x, int y){ }
char sub(String x){ }
void sub(int x) - 정수형으로 하나 들어오지만 return이 없음
int, char, void 아무것도 쓰지 말아야됨.

package constructor;

public class ConstructorMain {
    private String name;
    private int age;

public ConstructorMain() { // 괄호 안에 아무것도 없는 기본 생성자
	System.out.println("기본 생성자");
}
public ConstructorMain(String name) {
	this.name = name;
}
public ConstructorMain(int age) {
	this.age = age;
}

public static void main(String[] args) {
	ConstructorMain aa = new ConstructorMain();
	System.out.println(aa.name + "\t" + aa.age);
	System.out.println("----------------------");

	ConstructorMain bb = new ConstructorMain("홍길동");
	System.out.println(bb.name + "\t" + bb.age);
	System.out.println("----------------------");
	
	ConstructorMain cc = new ConstructorMain(25);
	System.out.println(cc.name + "\t" + cc.age);
	System.out.println("----------------------");
    }
}

생성자 Overload

생성자 끼리는 호출 가능

this

  1. 생략가능
  2. 자기 자신 클래스의 정보(reference-참조값)를 갖고 있다.

this( )

  1. Overload 된 다른 생성자를 호출할 때

  2. 생성자에서 반드시 첫줄에 써야 한다.

    public ConstructorMain(String name) {
        this.name = name;
    }
    public ConstructorMain(int age) {
        this("어피치"); // Overlodad된 다른 생성자 호출
        this.age = age;
  • this("어피치");가 위 String name을 호출함.
    그리고 생성자 안에서 생성자를 호출 하려면 무조건 첫번째 줄에 위치해야 한다.

    public ConstructorMain() { // 괄호 안에 아무것도 없는 기본 생성자
    	System.out.println("기본 생성자");
    }
    public ConstructorMain(String name) {
    	this();
    	this.name = name;
    }
    public ConstructorMain(int age) {
    	this("어피치");
    	this.age = age;


    public void ConstructorMain() 하면 기본 생성자가 아닌게 된다.

this.


문제 (숙제)

/*
클럽 회원관리 프로그램 작성
여기는 폐쇄적인 모임으로 회원은 총 5명으로 한다
회원의 정보는 이름, 나이, 핸드폰, 주소로 설정한다
회원 가입, 수정, 출력 프로그램을 작성하시오
각각의 메소드로 구성하시오

[실행결과]
menu()


  1. 가입
  2. 출력
  3. 수정
  4. 삭제
  5. 끝내기

번호 :

이름 입력 :
나이 입력 :
핸드폰 입력 :
주소 입력 :

수정 : update()
핸드폰 번호 입력 : 010-1111-1111
회원 정보를 찾을 수 없습니다.
또는
핸드폰 번호 입력 : 010-1234-5678

이름 나이 핸드폰 주소
홍길동 25 010-1234-5678 서울

수정 할 이름 입력 :
수정 할 핸드폰 입력 :
수정 할 주소 입력 :

회원 정보 수정 완료

삭제 : delete()
핸드폰 번호 입력 : 010-1111-1111
회원 정보를 찾을 수 없습니다.
또는
핸드폰 번호 입력 : 010-1234-5678

회원 정보 삭제 완료
*/

package constructor;

public class MemberMain {

public static void main(String[] args) {
	//MemberService클래스 안에 menu()호출->new
	MemberService ms = new MemberService();
	ms.menu();                             // menu 함수 호출
	System.out.println("프로그램을 종료합니다.");

	}
}
------------------------------------------------------------------
package constructor;

public class MemberDTO { 
// Data Transfer Object 1인분 - MemeberVO (Value Object)이것과 비슷

private String name;
private int age;
private String phone;
private String address;

// 인수 4개를 받는 생성자 잡기
public MemberDTO(String name, int age, String phone, String address) {
	this.name = name;
	this.age = age;
	this.phone = phone;
	this.address = address;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

public String getPhone() {
	return phone;
}

public void setPhone(String phone) {
	this.phone = phone;
}

public String getAddress() {
	return address;
}

public void setAddress(String address) {
	this.address = address;
	}
}
----------------------------------------------------------

package constructor;

import java.util.Scanner;

public class MemberService { // 딱 1인분만 한다.
//배열로 만든다
Scanner scan = new Scanner(System.in);
MemberDTO[] ar = new MemberDTO[3];

public MemberService() {
	System.out.println("기본 생성자");
}

public void menu(){
	
	int num;
	
	while(true) {
		System.out.println();
		System.out.println("***********");
		System.out.println("  1. 가입");
		System.out.println("  2. 출력");
		System.out.println("  3. 수정");
		System.out.println("  4. 삭제");
		System.out.println("  5. 끝");
		System.out.println("***********");
		System.out.print  ("  번호 : ");
		num = scan.nextInt();
		
		if(num==5) break; // while문을 벗어나라
		if(num==1) 
			insert(); //가입하러 가세요;
		else if(num==2)
			display();
		else if(num==3)
			update();
		else if(num==4) 
		    delete();
	}
}
    public void insert() {
	
	int i;
	for(i=0; i<ar.length; i++) {
		if(ar[i] == null) {
			
			System.out.print("이름 입력 : ");
			String name = scan.next();
			System.out.print("나이 입력 : ");
			int age = scan.nextInt();
			System.out.print("핸드폰 입력 : ");
			String phone = scan.next();
			System.out.print("주소 입력 : ");
			String address = scan.next();
			
		    ar[i] = new MemberDTO(name, age, phone, address);
		    System.out.println("가입 완료");
		   
		   break; // for문을 벗어나라
		} //if문
	}// for문
	
	if(i == ar.length) {
		System.out.println("회원 마감");
	}
}
public void display() {
	for(int i=0; i<ar.length; i++) {
		if(ar[i]!=null) {System.out.println("이름 : " + ar[i].getName());
		               System.out.println("나이 : " + ar[i].getAge());
		               System.out.println("전화번호 : " + ar[i].getPhone());
		               System.out.println("주소 : " + ar[i].getAddress());
		               System.out.println("-----------");
		}
	}// for 문
}
public void update() {
	System.out.print("핸드폰 번호 입력 : ");
	
	String phone = scan.next();
	boolean boo = false;
	
	for(int i=0; i<ar.length; i++) {	
	if(ar[i] != null && ar[i].getPhone().equals(phone)) {
		System.out.println("수정 할 이름 입력 : ");
		String name = scan.next();
		System.out.print("수정 할 나이 입력 : ");
		int age = scan.nextInt();
		System.out.println("수정 할 핸드폰 입력 : ");
		String newphone = scan.next();
		System.out.println("수정 할 주소 입력 : ");
		String address = scan.next();
		
		ar[i].setName(name);
        ar[i].setAge(age);
        ar[i].setPhone(newphone);
        ar[i].setAddress(address);
		
		System.out.println("★★★★★★★★★★★★★★★");
		System.out.println("회원 정보 수정 완료");
		
		boo = true;
		break;
		}
	}
if (!boo) {
    System.out.println("회원 정보를 찾을 수 없습니다.");
}
}

public void delete() {
     System.out.print("핸드폰 번호 입력: ");
        String phone = scan.next();
        boolean boo2 = false;

    for (int i = 0; i < ar.length; i++) {
        if (ar[i] != null && ar[i].getPhone().equals(phone)) {
            ar[i] = null;
            System.out.println("★★★★★★★★★★★★★★★");
            System.out.println("회원 정보 삭제 완료");

            boo2 = true;
            break;
        }
    }

    if (!boo2) {
        System.out.println("회원 정보를 찾을 수 없습니다.");
 	   }
	}
}

String

  1. 문자열 (= 주소)
  2. literal("") 생성 가능
  3. 문자열 편집(수정)을 할 수 없다.
  4. 비교시 == 사용하면 reference(참조값)을 비교 한다
    equals() 사용하면 문자열의 내용을 비교한다.

리터럴 (종류들을 의미)
1. 논리형 literal - true, false
2. 문자형 literal - 'A', 'K', '수",.....
3. 정수형 literal - 25, 13,.....
4. 실수형 literal - 36.25, 21850.44,....
5. 문자열 literal - "korea"

※ 문자열 자체가 reference(참조값) 이다.
※ 똑같은 내용의 문자열 리터럴은 메모리에 1번만 생성된다.
new는 할 때마다 메모리에 생성 된다

package class_;

public class StringMain {

public static void main(String[] args) {
	String a = "apple"; // literal로 생성했음.
	String b = "apple"; // 못잡아 b도 a의 "apple"을 가리킨다.
	if(a==b) System.out.println("a와 b의 참조값은 같다");
	else System.out.println("a와 b의 참조값은 다르다");
	if(a.equals(b)) System.out.println("a와 b의 문자열은 같다");
	else System.out.println("a와 b의 문자열은 다르다");
	
	
	System.out.println();
	
	String c = new String("apple");
	String d = new String("apple");
	if(c==d) System.out.println("c와 d의 참조값은 같다");
	else System.out.println("c와 d의 참조값은 다르다");
	if(c.equals(d)) System.out.println("c와 d의 문자열은 같다");
	else System.out.println("c와 d의 문자열은 다르다");
	
	System.out.println();
	
        /*오늘 날짜는 
오늘 날짜는 2023
오늘 날짜는 20237
e ---> "오늘 날짜는 2023719"

문자열은 편집이 안된다. -> 메모리에 4번의 생서이 일어난다.
JVM(자바가상머신)에 의해서 삭제 시 Garbage Collector로 보낸다
Garbage Collector가 실행되면 컴퓨터는 멈춘다
*/
    
	String e = "오늘 날짜는 " + 2023 + 7 + 19;
	System.out.println("e = " + e);
	
	System.out.println();
	
	System.out.println("문자열 크기 = " + e.length());
	
	for(int i=0; i<e.length(); i++) {
		System.out.print(e.charAt(i)+" ");
	}
	
	System.out.println();
	
	
	System.out.println("부분 문자 열 추출 = "+ e.substring(7));
	System.out.println("부분 문자 열 추출 = "+ e.substring(7,11)); //2023
	
	System.out.println("대문자 변경 = " + "Hello".toUpperCase());
	System.out.println("소문자 변경 = " + "Hello".toLowerCase());
	
	System.out.println("문자열 검색 = " + e.indexOf("짜"));
	System.out.println("문자열 검색 = " + e.indexOf("날짜"));
	System.out.println("문자열 검색 = " + e.indexOf("개바부")); // -1
	
	System.out.println("문자열 치환 = " + e.replace("날짜", "일자"));
	}
}


문제 (숙제)

package class_;

public class StringMain2 {

public static void main(String[] args) {
	String original = "aabba";
	System.out.println("문자열 입력 : " + original);
	String current = "aa";
	System.out.println("현재 문자열 입력 : " + current);
	String change = "dd";
	System.out.println("바꿀 문자열 입력 : " + change);
	System.out.println(original.replace(current, change));
	
	System.out.println();
	
	String original1 = "aAbbA";
	System.out.println("문자열 입력 : " + original1);
	String current1 = "aa";
	System.out.println("현재 문자열 입력 : " + current1);
	String change1 = "dd";
	System.out.println("바꿀 문자열 입력 : " + change1);
	System.out.println(original1.toLowerCase().replace(current1, change1));
	
System.out.println();
	
	String original2 = "aabbaa";
	System.out.println("문자열 입력 : " + original2);
	String current2 = "aa";
	System.out.println("현재 문자열 입력 : " + current2);
	String change2 = "dd";
	System.out.println("바꿀 문자열 입력 : " + change2);
	System.out.println(original2.toLowerCase().replace(current2, change2));
	
System.out.println();
	
	String original3 = "AAccaabbaaaaatt";
	System.out.println("문자열 입력 : " + original3);
	String current3 = "aa";
	System.out.println("현재 문자열 입력 : " + current3);
	String change3 = "dd";
	System.out.println("바꿀 문자열 입력 : " + change3);
	System.out.println(original3.toLowerCase().replace(current3, change3));
	
System.out.println();

	String original4 = "aabb";
	System.out.println("문자열 입력 : " + original4);
	String current4 = "aaaaa";
	System.out.println("현재 문자열 입력 : " + current4);
	String change4 = "ddddd";
	System.out.println("바꿀 문자열 입력 : " + change4);
	int count = countOccurrences(original4.toLowerCase(), current4.toLowerCase());
	
	if (count == 0) { 
	    System.out.println("원하는 문자열이 없습니다. "
	    		+"\n"+ "치환 할 수 없습니다.");
	    }else { 
	System.out.println(original4.toLowerCase().replace(current4, change4));
	    }
	}
	 public static int countOccurrences(String original4, String current4) {
	        int count = 0;
	        int index = 0;
	        
	        while ((index = original4.indexOf(current4, index)) != -1) {
	            count++;
	            index += current4.length();
	        }
	        
	        return count;
	    }
	}

위 문제를 스캐너를 사용한 코드

package class_;

import java.util.Scanner;

public class StringMain2 {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    
    System.out.print("문자열 입력: ");
    String original = scan.nextLine();
    
    System.out.print("현재 문자열 입력: ");
    String current = scan.nextLine();
    
    System.out.print("바꿀 문자열 입력: ");
    String change = scan.nextLine();
    
    int count = countOccurrences(original.toLowerCase(), current.toLowerCase());
    
    if (count == 0) {
        System.out.println("원하는 문자열이 없습니다. 치환 할 수 없습니다.");
    } else {
        String replaced = original.replace(current, change);
        System.out.println(replaced);
        System.out.println(count + "번 치환");
    }
}

public static int countOccurrences(String original, String current) {
    int count = 0;
    int index = 0;
    
    while ((index = original.indexOf(current, index)) != -1) {
        count++;
        index += current.length();
    }
    
    return count;

}
}


예제들

package class_;

public class ComputeArray {
    private int x;
    private int y;
    private int sum;
    private int sub;
    private int mul;
    private double div;

public void setX(int x) {
	this.x = x;
}
public void setY(int y) {
	this.y = y;
}
public void calc() {
	sum = x + y;
	sub = x - y;
	mul = x * y;
	div = (double)x / y;
}

public int getX() {
	return x;
}
public int getY() {
	return y;
}
public int getSum() {
	return sum;
}
public int getSub() {
	return sub;
}
public int getMul() {
	return mul;
}
public double getDiv() {
	return div;
	}
}

--------------------------------

package class_;

public class ComputeMainArray {

public static void main(String[] args) {
	ComputeArray[] com = new ComputeArray[3];
	for (int i=0; i<com.length; i++) {
		com[i] = new ComputeArray();
	}// for
	
	com[0].setX(320); com[0].setY(258);
	com[1].setX(258); com[1].setY(127);
	com[2].setX(572); com[2].setY(326);
	
	for(ComputeArray data : com) {
		data.calc();
		System.out.println(data.getX()+"\t"+
				           data.getY()+"\t"+
				           data.getSum()+"\t"+
				           data.getSub()+"\t"+
				           data.getMul()+"\t"+
				           data.getDiv());
		
		}
	}
}

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

덕분에 좋은 정보 얻어갑니다, 감사합니다.

답글 달기