2020년 10월 19일

업데이트:


가변 배열

다차원 배열 생성 시 마지막 배열 차수의 크기를 지정하지 않고 나중에 서로 크기가 다른 배열로 지정한 배열.

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

// 가변 배열로 생성 시 각기 다른 행의 길이를 가질 수 있다.

메소드(Method)

수학 함수와 비슷하며 호출을 통해 사용한다. 전달 값(매개 변수)이 없는 상태로 호출되기도 하고, 어떤 값을 전달 받아 호출되기도 하며 함수 내에 작성된 연산을 수행 후 반환 값을 리턴하는데, 이때 반환 값이 있거나 없을 수 있다.

[접근제한자] [예약어] 반환형 메소드명([매개 변수]) {
    // 코드 작성
}

public int sum(int num1, int num2){ // 외부로부터 num1, num2 값을 받아 온다.
    return num1 - num2; // num1 - num2 연산 수행 후 결과 값을 반환한다.
}


메소드(Method) 접근제한자

기호 접근제한자 클래스 패키지 자손 클래스 전체                
+ public O O O O                
# protected O O O                  
~ (default) O O                    
- private O                      


메소드(Method) 예약어

구분 전체                            
static staitc 영역에 할당하여 객체 생성 없이 사용한다.                            
final 종단의 의미, 상속 시 오버라이딩이 불가능하다.                            
abstract 미완성된, 상속하여 오버라이딩으로 완성시켜 사용해야한다.                            
synchronized 동기화 처리, 공유 자원에 한 개의 스레드만 접근 가능하다.                            
static final static과 final의 의미를 둘 다 가진다.                            


메소드(Method) 반환형

구분 전체                          
void 반환형이 없음을 의미하며, 반환 값이 없을 경우 반드시 작성해야 한다.                          
기본 자료형 연산 수행 후 반환 값이 기본 자료형일 경우 기본 자료형을 작성한다.                          
배열 연산 수행 후 반환 값이 배열인 경우 배열의 주소값이 반환된다.                          
클래스 연산 수행 후 반환 값이 해당 클래스 타입의 객체일 경우 해당 객체의 주소값이 반환된다. (클래스 == 타입)                          


메소드(Method) 매개변수

구분 전체  
() 매개 변수가 존재하지 않는다.  
기본 자료형 기본형 매개 변수 사용 시 값을 복사하여 전달한다. 매개 변수 값을 변경하여도 본래 값은 변경되지 않는다.  
배열, 클래스 배열, 클래스 등 참조형을 매개 변수로 전달 시에는 데이터의 주소값을 복사하여 전달하기 때문에 매개 변수를 수정하면 본래의 데이터가 수정된다.  
가변인자 매개변수의 개수를 유동적으로 설정하는 방법으로 가변 매개변수 외 다른 매개 변수가 있으면 가변 매개 변수를 마지막에 설정하는 방법 : (자료형 … 변수명)  


리턴(return)

해당 메소드를 종료하고 자신을 호출한 메소드로 돌아가는 예약어이다. 반환 값이 있다면 반환 값을 가지고 자신을 호출한 메소드로 돌아간다.

// 메소드

// public class MethodService

public class MethodService{
    public void displayMenu() {  // 출력용 메소드
        // 두 정수를 입력받고
        // 다음 메뉴 중 하나를 선택해서 해당 결과를 반환받아 출력

        Scanner sc = new Scanner(System.in);

        System.out.print("정수 1 : ");
        int num1 = sc.nextInt();

        System.out.print("정수 2 : ");
        int num2 = sc.nextInt();

        System.out.println("1. 더하기");
        System.out.println("2. 빼기");
        System.out.println("3. 두 수 사이의 모든 정수를 배열로 반환받기");
        int sel = sc.nextInt();
        sc.nextInt();

        switch(sel) {
            case 1 : 
                int result = add(num1, num2);
                System.out.println(num1 + " + " num2 + " = " + result);
                break;
            case 2 : 
                System.out.println(num1 + " - " + num2 + " = " + subtract(num1, num2));
                break;
            case 3 :
                System.out.println(Arrays.toString(method1(num1, num2)));
                break;
            default: System.out.println("잘못 입력하셨습니다.");
        }
    }

    // 두 수를 전달받아 더한 값을 반환
    // [접근제한자] [예약어] [반환형] 메소드명([매개변수]) {}
    public int add(int n1, int n2){
        //매개변수는 전달받고자 하는 데이터의 개수와 자료형이 중요함
        //변수명은 중요하지 않음.
        int result = n1 + n2;

        return result;
        // return : 해당 메소드를 호출한 부분으로 돌아아게 하는 구문
        // 반환형이 void가 아닐경우 반환값을 가지고 돌아감.
    }

    public int subtract(int num1, int num2){
        return num1 - num2;
    }

    public int[] method1(int num1, int num2){
        //int[]을 반환하는 메소드

        //num1이 num2보다 더 큰 경우 두 변수 값을 교환
        if(num1 > num2) {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }

        // 만약 num1이 3이고 num2가 5면
        // 총 3, 4, 5 이렇게 세 칸이 필요함.
        int[] arr = new int[num2 - num1 + 1];

        for(int  i = 0; i < arr.lnegth; i++){
            arr[i] = num1++;
        }
        return arr;
    }

    public static int staticMethod(int[] arr){
        // 전달받은 배열 내에 있는 데이터의 합 반환
        int sum = 0;
        for(int  i = 0; i < arr.length; i++){
            sum += arr[i];
        }
    }
    return;
}


// main 메소드
public static void main(String[] args){
    intp[] arr = {5, 7, 8, 1, 3, 3, 4, 7, 9, 3, 4, 7};
    System.out.println(MethodService.staticMethod(arr));

    return


위의 코드의 메모리 구조를 그림으로 표현하면 다음과 같다.


객체 배열

객체 참조형 변수를 저장하는 배열로 배열의 자료형을 클래스명(사용자 정의 자료형)으로 지정하여 활용한다.

// 선언
클래스명[] 배열명;
클래스명 배열명[];

// 할당
배열명 = new 클래스명[배열크기];

// 선언과 동시에 할당
클래스명 배열명[] = new 클래스명[배열크기];

// 인덱스를 이용한 초기화
배열명[i] = new 클래스명();

// 선언과 동시에 할당 및 초기화
클래스명 배열명[] = { new 클래스명(), new 클래스명()};


Example arr[] = new Example[2];
arr[0] = new Example();
arr[1] = new Example();


위의 Example 객체 배열의 메모리 구조를 그림으로 표현하면 다음과 같다.


// MVC Model2 디자인 패턴
// Model : 데이터, 로직 처리(비즈니스 로직 처리 담당)
// View :  클라이언트의 요청(입력), 응답(출력) 담당
// Controller : 요청의 종류에 따라 Service를 결정하고 
 //             결과를 알맞는 View로 연결하는 담당

 //Book.java
public class Book {
    // 필드(멤버변수, 클래스변수)
    private String title;
    private String author;
    private String publisher;
    private int price;


    // 생성자
    // 기본 생성자 : 사용하지 않아도 일단 선언해놓는 것이 좋음
    public Book(String title, String author, String publisher, int price){
        his.title = title;
		this.author = author;
		this.publisher = publisher;
		this.price = price;
    }


    // 메소드
    public void setTitle(String title) {
		this.title = title;
	}
	public String getTitle() {
		return title;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getAuthor() {
		return author;
	}
	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}
	public String getPublisher() {
		return publisher;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getPrice() {
		return price;
	}
	

	// 객체 필드 정보 반환용 메소드
	public String information() {
		return title + " / " + author + " / " + publisher + " / " + price + "원";
		// 자바의정석 / 남궁 성 / 도우 출판 / 30000원
	}
}


//ObjectArrayView.java
public class ObjectArrayView {
    // 클래스 내부에서 스캐너를 모두 사용할 수 있게 멤버 변수로 선언
    private Sanner sc = new Scanner(System.in);

    private ObjectArrayService service = new ObjectArrayService();

    // 메인 메뉴
    public void displayView() {
        int sel = 0; // 메뉴 번호를 입력받을 임시 변수
        do { 
            System.out.println("========== 메뉴 ==========");
            System.out.println("1. 전체 책 정보 조회");
            System.out.println("2. 책 제목 검색");
            System.out.println("0. 프로그램 종료");
            System.out.println("메뉴 선택 : ");
            sel = sc.nextInt();
            sc.nextInt(); // 버퍼에 남아있는 개행문자 제거

            switch(sel){
                case 1 : System.out.println(service.seletAll()); break;
                case 2 : System.out.println(searchTitle()); break;
                case 0 : break;
                default : System.out.println("잘못 입력하셨습니다.");
            }
            System.out.println();
        } while(sel != 0);
    }


    // 제목 검색용 View
    public String searchTitle() {
        System.out.print("검색할 책 제목 입력 : ");
        String title = sc.nextLine();

        System.out.println("----- 검색 결과 -----");

        String str = service.searchTitle(title); // 결과 반환용 변수

        if(str == null){
            str = "해당 제목의 책이 존재하지 않습니다.";
        }

        return  str;
    }
}


//ObjectArrayService.java
public class ObjectArrayService {
    // Service 클래스 내 어디서든 사용 가능한 Book 객체 배열 선언 및 할당, 초기화
    private Book[] books = { new Book("자바의정성", "남궁 성", "도우출판", 30000), 
							 new Book("어린왕자", "생택쥐베리", "교학사", 8000), 
							 new Book("자바 쉽죠?", "백동현", "KH출판", 100000),
							 new Book("개미", "베르나르 베르베르", "교보문고", 12000),
							 new Book("보리 국어사전", "토박이 사전 편찬실", "토박이", 63000)
							}; // 명시적 초기화
}

// 객체 생성 시 초기화 순서
// JVM 기본값 -> 명시적 초기화 -> 초기화 블럭 -> 생성자

// 기본 생성자
public ObjectArrayService() {}
// 생성자 필드 초기화를 진행하지 않으면 명시적 초기화 내용 유지

// 저장된 책 정보를 모두 조회해 String 형태로 반환하는 메소드
public String selectAll() {
    String str = "";

    for(int i = 0; i < books.length; i++){
        str += books[i].information() + "\n";
    }

    return str;
}

// 객체 배열에 입력받은 제목의 책이 있는지 검사하여 책 정보 반환
public String searchTitle(String title){
    String str = null;

    for(int i = 0; i < books.length; i++){
        if(books[i].getTitle().equals(title)) {
            // book 배열 요소 중 제목이 title과 일치하는 요소가 있다면
            // 해당 요소의 정보 (information())를 str에 대입
            str = books[i].information();
        }
    }
    return str;
}


// ObjectArrayRun.java
public static void main(String[] args){
    new ObjectArrayView().displayView();
}

태그:

카테고리:

업데이트:

댓글남기기