XAMPP MYSQL과 기존 설치했던 MYSQL이 충돌이 나서 접속이 안되는 문제가 발생했다..

 

이럴 경우 포트를 죽이거나 아니면 포트번호를 변경해야한다

 

아래 소개하는 방법은 MYSQL 프로그램을 많이 사용하지 않고 가끔 사용할 때

포트번호 3306을 동시에 같이 사용할 때 사용하는 방법이다

 

1. MySQL Installer에 접속 후 Reconfigure를 클릭한다

 

 

2. 임시로 포트번호를 3306에서 비어있는 포트번호로 바꾼다 ex) 3307

 

3. Mysql을 설치할 때 지정했던 비밀번호를 입력 후 Check 클릭 후 Next 클릭한다

 

4. Next를 클릭한다

5. Execute 클릭한다

6. Finish를 클릭한다

 

XAMPP mysql을 사용할 때는 기존 mysql 포트번호를 3307로 변경해놨다가 MYSQL을 사용할 일이 생기면 다시 같은 방법으로 3306으로 바꾸면 된다

 

이렇게 하면 포트 3306 하나로 2개의 mysql을 사용할 수 있다

*Visual Studio 2022를 사용하였습니다.

 

1. 아래 링크 접속

MySQL :: MySQL Downloads

 

2. MySQL Community(GPL) Downloads 클릭

 

3. MySQL Installer for Windows 클릭

 

4. Archives 클릭

 

5.     5.7.41버전 선택 후 용량이 더 큰 아래 파일 Download 클릭

mysql을 c언어와 연동하는 경우에 최신버전은 연동이 안되는 경우가 있어 5.7버전을 선택한다

 

6. 다운로드 받은 폴더에 가서 아래 파일 실행

 

7. Developer Default 클릭, Next 클릭

 

8. next 클릭

 

 

9. Execute 클릭

 

10. next 클릭

 

11. 포트번호 선택 후 Next 클릭

Maria DB나 xampp 내장 Mysql이나 3306을 쓰고 있으면 다른 번호로 변경

 

 

12. 비번입력후  Next 클릭

비번 까먹으면 안되므로 쉬운 비번 선택

.

13. Next 클릭

 

14. Next 클릭

 

15. Execute 클릭

 

16. Finish 클릭

 

17. Next 클릭

 

18. Finish 클릭

 

 

19. Next 클릭

 

20. 아까 적었던 비번 입력 후 Check 클릭 후 Next 클릭

 

21. Execute 클릭

22. Finish 클릭

 

23. Next 클릭

 

24. Finish 클릭

 

25. 지금 이렇게 설치해놓으면 mysql.exe파일이 포함돼어있는 C:\Program Files\MySQL\MySQL Server 5.7\bin 위치에서만 Mysql이 접속되는데 모든 위치에서 mysql을 접속하기 위해 환경변수를 설정해준다

 

26. 톱니바퀴 모양 클릭

 

27. 시스템 클릭

 

28.  왼쪽 메뉴 수크롤 내려서 정보 클릭

 

29. 오른쪽 화면 스크롤 내려서 고급 시스템 설정 클릭

 

 

30. 환경변수 클릭

 

 

31.시스템 변수 Path 클릭하고 편집 클릭 

 

32. 새로만들기 클릭 후 mysql.exe가 들어있는 파일 경로 위치 복붙해서 추가

 

33.  mysql -V 명령어로 설치 잘됐는지 확인

 

34. mysql 명령어를 이용해 접속 시도

mysql -u root -p

한 후

Enter password에서 설치할때 만든 password 입력

 

35. password 입력후 접속 성공

이제 여러 mysql명령어를 이용해 DB 만들기 가능

깊은 복사와 얕은 복사를 알아보기 전에 우선 객체 배열에 대해 알아본다

 

목차

1. 객체 배열

2. 깊은 복사와 얕은 복사


1. 객체 배열

int[] num=new int[10] 하듯이 객체도 배열을 만들 수 있다.

책 객체 배열을 만들어보자.

Book[] library =new Book[5]이런식으로 만들 수 있다

그렇다면 이렇게 공간을 만들면 Book 인스턴스 5개가 만들어진걸까?

 

아니다. 

 

아래 예제를 보자.

출력결과가 어떻게 될까

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}

}

public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[5];
	
		
		for(int i=0;i<library.length;i++) {
			
			System.out.println(library[i]);
		}
		
	}

}

아래와 같이 null이 출력되는데 이는 인스턴스가 생성된 것이 아니라 인스턴스 주소가 담길 공간이 5개 생성된 것이다.

 

 

아래와 같이 따로 인스턴스를 또 만들어줘야한다

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}
	public Book(String bookTitle,String author) {
		this.bookTitle=bookTitle;
		this.author=author;
	}
}


public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[5];
		library[0]=new Book("책제목0","홍길일");
		library[1]=new Book("책제목1","홍길이");
		library[2]=new Book("책제목2","홍길삼");
		library[3]=new Book("책제목3","홍길사");
		library[4]=new Book("책제목4","홍길오");
		
	}

}

 

 

자 이제 본론으로 간다.

 


2. 깊은 복사와 얕은 복사

일단 한 줄 요약하면 

얕은 복사는 인스턴스의 주소가 복사되는 것이고

깊은 복사는 인스턴스의 값이 복사되는 것이다

 

1) 얕은 복사(shallow copy)

아래와 같이 arraycopy메서드를 이용해서 library 배열에 있는 객체 배열을 library1 배열에 복사를 했다.

그런데 아까 객체 배열은 인스턴스 값을 따로 또 생성해줘야하는데 아래 예제에는 인스턴스 값을 따로 생성해주지 않았는데 library1 배열에 똑같이 값이 복사되었다.

어떻게 가능한 것일까?

 

이 경우는 바로 객체의 값이 아니라 주소 값이 복사되었기 때문이다.

주소가 동일하므로 값이 똑같이 출력되는 것이다.

 

그러면 배열을 복사해서 다른 배열로 사용하고 싶으면 어떻게 해야할까?

바로 깊은 복사를 사용하면 된다

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}
	public Book(String bookTitle,String author) {
		this.bookTitle=bookTitle;
		this.author=author;
	}
	
	public void showInfo() {
		System.out.println(bookTitle+", "+author);
	}
}

public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[5];
		Book[] library1=new Book[5];
		library[0]=new Book("책제목0","홍길일");
		library[1]=new Book("책제목1","홍길이");
		library[2]=new Book("책제목2","홍길삼");
		library[3]=new Book("책제목3","홍길사");
		library[4]=new Book("책제목4","홍길오");
		
		System.arraycopy(library, 0, library1, 0, 5);
			
		for(int i=0;i<library.length;i++) {
			
			library1[i].showInfo();
		}
		
	}

}

 

출력결과

 

2) 깊은 복사

반복문을 사용하든 System.arraycopy()메서드를 사용하든 객체 배열을 복사하면 항상 인스턴스 주소가 복사되므로 따로 관리 하고 싶다면 깊은 복사를 사용해야한다

 

아래 예문을 보자

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}
	public Book(String bookTitle,String author) {
		this.bookTitle=bookTitle;
		this.author=author;
	}
	
	
	
	public String getBookTitle() {
		return bookTitle;
	}
	public void setBookTitle(String bookTitle) {
		this.bookTitle = bookTitle;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public void showInfo() {
		System.out.println(bookTitle+", "+author);
	}
}

public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[2];
		Book[] library1=new Book[2];
		library[0]=new Book("책제목0","홍길일");
		library[1]=new Book("책제목1","홍길이");
		
		library1[0]=new Book();
		library1[1]=new Book();
		
		
		for(int i=0;i<library.length;i++) {
			library1[i].setBookTitle(library[i].getBookTitle());
			library1[i].setAuthor(library[i].getAuthor());
		}
		library[0].setBookTitle("책제목3");
		
		for(int i=0;i<library.length;i++) {
			library[i].showInfo();
		}
		
          System.out.println("---------");
          
		for(int i=0;i<library.length;i++) {
			library1[i].showInfo();
		}
		
	}

}

아래와 같이 결과값이 분리되는 것을 볼 수 있다

 

 

출처 : Do it! 자바 프로그래밍 입문-박은종

아래의 첫번째 예시를 보자.

public 접근 제어자를 사용해서 언제든지 멤버 변수의 값이 바뀌도록 했다.

package hiding;

public class Student {
	public int studentID;
	public String studentName;
	public int grade;
	public String address;

}
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student student = new Student();
		student.studentName="홍길동";
		System.out.println(student.studentName);

	}

}

 

 

그리고 두번째 예시를 보자.

getter, setter 함수를 이용해 private 멤버변수를 접근하도록 했다.

package hiding;

public class Student {
	public int studentID;
	private String studentName;
	public int grade;
	public String address;
	
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

}
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student student = new Student();
		//student.studentName="홍길동";
		student.setStudentName("홍길동");
		System.out.println(student.getStudentName());

	}

}

 

 

접근 제어자를 private으로 선언하면 외부 클래스에서 사용할 수 없다.

그리고 위 1, 2예시 모두 결국엔 변수를 사용할 수 있다.

그렇다면 굳이 왜 접근제어자를 private으로 써서 귀찮게 메서드를 만들어 사용하는게 바람직한걸까?

 

 

다음 예제를 보면서 알아보자.

학생수가 32명있어서 학번을 1부터 32번까지 할당하는데 누군가의 실수로 학번이 33번이라고 입력된다고 해보자.

메서드에 조건문을 달아주면 오류가 나더라도 그 값이 해당 변수에 대입되지 않아 정보의 오류를 막을 수 있다

package hiding;

public class Student {
	private int studentID;
	public String studentName;
	public int grade;
	public String address;
	
	
	public int getStudentID() {
		return studentID;
	}
	public void setStudentID(int studentID) {
		if(studentID >32) {
			System.out.println("오류, 다시 입력하시오");
		}else {
		this.studentID = studentID;
	}
 }

}
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student student = new Student();
		
		student.setStudentID(33);
		

	}

}

 

이치럼 클래스 내부에 사용할 변수나 메서드는 private으로 선언해서 외부에서 접근하지 못하도록 하는 것을 정보 은닉이라고 한다

 

 

출처 : Do it! 자바 프로그래밍 입문 - 박은종

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. this 예약어

2. static 변수

3. 배열

4. 상속, super 예약어

5. 오버라이딩(overrriding)

6. 추상클래스


1. this 예약어

앞에서도 맛보기로 살짝 봤듯이 this는 자기자신을 가리키는 예약어이다.

 

science.getTitle("안녕")이렇게 메서드를 호출하면 

public void getTitle(String title){}메서드가 호출되는데

this. title= title은 즉 science.getTitle="안녕"과 동일하고

science.getTitle이라는 자기자신을 this라고 표현하는 것이다

 

english.getTitle("안녕안녕")도 마찬가지로 

this.title=title은 english.getTitle="안녕안녕"을 뜻한다

package test;

class Book {
  private String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  public void getTitle(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        science.getTitle("안녕");
        System.out.println(science.getTitle());
        
        Book english = new Book();
        english.getTitle("안녕안녕");
        System.out.println(english.getTitle());
    }
}

 

 

1-1) 생성자에서 다른 생성자를 호출하는 this

아래와 같이 클래스에 생성자가 여러 개 있을 때 this라는 예약어를 통해 이 클래스의 다른 생성자를 호출할 수 있다

 

Book()생성자에서 this("1번째 책")을 사용해 Book(String title) 생성자를 호출한 것이다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public Book(){
	  this("1번째책");
  }
  public Book(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        System.out.println(science.title);
    }
}

 

1-2) 자신의 주소를 반환하는 this도 있는데 이 부분은 생략한다


2. static 변수

static 변수는 C언어에서 봤던 개념과 거의 똑같다.

프로그램이 실행되어 메모리에 올라갔을 때 딱 한번만 메모리 공간이 할당되며 그 값은 모든 인스턴스가 공유한다

 

아래 예문의 결과값을 예상해보자.

package test;

class Book {
  public int a=2;
  static public int b=3;
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
       
        english.a++;
        System.out.println(science.a);
        english.b++;
        System.out.println(science.b);
        science.a++;
        System.out.println(english.a);
        science.b++;
        System.out.println(english.b);
        
    }
}
더보기

2

4

3

5

 

static이 아닌 a는 인스턴스마다 새로 초기화가 된다

static인 b는 맨처음 한번 3으로 초기화되고 이 3을 인스턴스끼리 공유한다

 

english.a++; 

System.out.println(science.a); //science.a의 값은 변동이 없어 2가 된다

english.b++; 

System.out.println(science.b); //b가 static변수이므로 1증가된 4가 된다

science.a++;

System.out.println(english.a); //1번증가됐으므로 1증가된 3이 된다

science.b++;

System.out.println(english.b); //b가 static 변수이므로 4에서 1증가된 5가 된다


3. 배열

배열 역시 C언어에서 봤던 개념과 동일하다

클래스가 여러가지 다른 자료형을 설계하는 도구였다면 배열은 여러가지 같은 자료형을 설계하는 도구이다

배열은 같은 자료형을 여러개 한꺼번에 관리할 수 있다

 

배열은 아래와 같은 형태이다

int[] a=new int[10]
int a[]=new int[10]

2가지 형태가 다 가능하다

 

배열 선언과 동시에 초기화

배열은 선언하면 그와 동시에 각 요소의 값이 초기화 되며 아래와 같이 배열 선언과 동시에 특정 값으로 초기화도 가능하다

int[] a=new int[] {1,2,3};
int[] a={1,2,3};

 

자바의 배열은 배열 길이를 나타내는 length 속성을 가지며 a.length하면 3이 출력된다

package test;


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

        int[] a= {1,2,3};
        System.out.println(a.length);
        
    }
}

 

배열의 기본적인 것들은 C언어와 동일하므로 생략한다

C언어에서의 배열 개념만 알면 자바에서 배열은 사실 문제만 풀어보면 된다


4. 상속

상속이라는 말은 익힐 들어봤을 것이다.

부모님의 재산을 물려받는 것을 보통 상속이라고 하는데 거의 똑같이 생각해주면 된다.

B 클래스가 A클래스를 상속받으면 B클래스는 A클래스의 객체 변수와 메서드를 사용할 수 있다

 

기본형태는 아래와 같다. Cat이라는 클래스가 Animal이라는 클래스를 상속받았고

그 표현으로 extends라는 표현을 쓴다. 

package test;

class Animal {
	
}

public class Cat extends Animal{
	
}

 

쓸 수 있는 영역을 extends 확장한다는 것이다

상속을 하는 이유를 생각해보자.

고양이 클래스가 있고 개 클래스가 있고 하마 클래스가 있고 이런식으로 여러개의 동물 클래스가 있다고 치자.

고양이, 개, 하마를 묶어서 한꺼번에 동물이라고 표현할 수 있다

고양이, 개, 하마는 모두 동물이므로 만약 따로 따로 클래스를 만들게되면 공통된 요소들이 많아지게 될 것이다

예를 들면 eat(), sleep() 뭐 이런 것들

따로따로 만들면 기능은 똑같은데 굳이 새로 만들어줘야하므로 효율적이지 않다

그래서 상속이라는 개념을 쓴다

 

또한 자바에서 모든 클래스는 Object 클래스의 자식이자 하위 클래스이다.(Object가 제일 상위 클래스)

extends(상속)을 하면 아래의 그림과 같이 확장된다

 

아래와 같은 예문을 보자. Cat cat1=new  Cat()으로 객체를 생성하며 Cat() 생성자를 호출한다. 

출력결과는 무엇일까

package test;

class Animal {
	public Animal(){
		System.out.println("내가 니 부모다");
	}
}

public class Cat extends Animal{
	public Cat(){
	System.out.println("부모님 안녕하세요");
	}
	
	 public static void main(String[] args) {
	  Cat cat1=new Cat(); //cat1 객체 생성
	 }
}
더보기

내가 니 부모다

부모님 안녕하세요

자식 객체를 만들었는데 부모 클래스의 생성자까지 같이 호출되는 것을 확인할 수 있다

즉, 하위 클래스에서 객체가 만들어질 때는 그 객체가 만들어지기 전에 부모가 먼저 만들어지고 그 다음 자식이 만들어진다는 것이다. (생각해보면 부모가 있어야 자식이 있는 것이 당연하다)

상위 클래스의 생성자가 호출된 후 상위 클래스의 객체 변수가 메모리에 생성된다

그 후 하위 클래스의 생성자가 호출된다

 

1) Cat cat1= new Cat(); 실행

2) Object 생성자 호출

3) Animal 생성자 호출

4) Cat 생성자 호출

 

이게 가능한 이유는 원래 super()라는 예약어가 있는데 그게 생략돼있는 것이다.

super()라는 것을 생략해도 컴파일러가 자동으로 넣어준다

super 예약어는 하위 클래스에서 상위 클래스로 접근할 때 사용하며 상위 클래스의 생성자를 호출하는데도 사용한다

 

만약에 매개변수가 있는 상위 클래스의 생성자를 호출해야한다면 super(매개변수); 이런 형태를 쓰면 된다


5. 오버라이딩(overrriding)

 

아래의 출력결과를 예상해보자.

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Cat cat1=new Cat();
	  cat1.eat();
	 }
}

 

더보기

고양이가 밥을 먹다

 

객체를 생성한 후 객체의 메서드를 호출했다. 그런데 아까 배웠듯이 객체가 생성될때 부모의 생성자가 먼저 호출되며 부모가 먼저 만들어진다고 했는데 어떻게 "고양이가 밥을 먹다"가 출력 된 걸까?

이처럼 상위클래스에서 eat()메서드가 이미 정의돼있다.

그런데 상위 클래스에서 정의한 메서드가 하위 클래스에 구현할 내용과 차이가 있을 때는 하위 클래스에서 메서드를 재정의할 수 있는데 이를 메서드 오버라이딩이라고 한다

부모 메서드와 자식 메서드가 동일한 형태로 공존하지만 부모 메서드는 무시되고 자식 메서드만 실행되는 것이다

 

오버라이딩을 하려면 반환형, 메서드 이름, 매개 변수 개수, 매개변수 자료형이 다 같아야 한다

 

 

그렇다면 아래의 출력결과도 예상해보자.

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	 }
}
더보기

고양이가 밥을 먹다

 

이번에는 특이하게 객체를 생성하는데 객체를 생성하는 자료형과 생성자가 다르다

Animal cat1= new Cat();

 

객체를 생성하는 자료형은 부모 클래스인 Animal이고 생성자는 자식의 생성자이다.

부모 클래스의 객체를 생성하는 것인데 이렇게 아래 그림처럼 Animal 자료형인 cat1이 Animal만 접근하는 줄 알았는데

부모 클래스는 항상 자식 클래스에서 자신의 메서드를 재정의했는지 확인하기 때문에 Animal 객체를 생성했지만 Animal의 eat()메서드가 아니라 자식의 eat()메서드가 실행된다


 

6. 추상클래스(Abstract class)

 

아래의 예문을 보자.

오버라이딩이 되면서 "동물이 밥을 먹다"는 절대로 실행될 일이 없다

그렇다면 굳이 적을 필요가 있을까?

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	 }
}

이런 생각에서 나온 것이 바로 추상 메서드이다.

 

메서드에서 반환타입 메서드 이름등 이런 부분을 선언부라고 하고 안에 중괄호{} 부분을 구현부라고 하는데

아래와 같이 추상메서드는 선언부(메서드 원형)만 존재한다. 

출처  : [Java의 정석]Chapter6.객체지향 프로그래밍(14~17) (velog.io)

 

 

추상메서드는 구현부가 없으므로 반드시 오버라이딩이 된다. 

그리고 구현메서드도 있는데 예를 들어 Animal 클래스를 상속받은 클래스가 고양이, 개 ,하마 정도가 있다고 하면 고양이, 개, 하마는 모두 공통적으로 잠을 자므로 굳이 재정의를 하지 않고 부모 클래스의 sleep()을 그대로 쓴다.

 

이렇게 추상클래스는 추상메서드와 구현메서드가 있고 서로 기능이 비슷한 클래스를 말한다

 

이에 대비되는 개념으로는 서로 기능이 다른 클래스를 인터페이스라고 한다

인터페이스는 구현메서드가 없고 100% 추상메서드로만 구성되어있다 

package test;

abstract class Animal {
	
	public abstract void eat();  //추상메서드
	
	public void sleep() {  //구현메서드
		System.out.println("밤에는 잔다");  
	}
}



public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	  cat1.sleep();
	 }
}

 

자바는 어렵게 출제가 되지 않으므로 이정도로 마무리하도록 하겠다.

이정도 공부했으면 기출문제를 풀고 개념을 다시 확인해보면 될 것이다


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

 

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. 객체 생성

2. 객체 생성시 메모리 구조(heap 영역)

3. 생성자

4. 접근제어자


*이 게시글에서는 속성=필드=객체변수=인스턴스 변수=멤버변수라고 불리는 것을 객체 변수라고 통일하겠다.

 

1. 객체 생성

앞선 2탄에서 클래스, 객체, 메서드, 메모리 구조에 대해 살펴 보았다. 

클래스는 책을 예를 들어 책이라는 자료형을 만들기 위해 구성요소(제목, 가격, 출판사, 저자등)를 하나로 합쳐놓은 것이다. 

책이라는 객체의 구성요소를 사용하기 위해 책이라는 자료형을 클래스로 만들었다면 그 구성요소를 이용해서 다양한 책(객체)을 만들어야 하지 않겠는가

자바에서는 Book science = new Book(); 이런 형태로 객체를 만들 수 있다.

이렇게 클래스를 이용해서 만든 객체 여기서는 science를 인스턴스라고 한다.

 

클래스는 붕어빵 틀, 객체는 붕어빵1,2 ... 이라고 생각하면 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
    }
}

science앞에 붙은 Book은 int, String처럼 Book이라는 자료형이라는 표시이므로

Book자료형 science를 선언한다는 의미이다.

Book science는 int a와 동일한 형태이다

뒤에 붙은 new Book()에서 new는 새로만들어진다는 예약어이고 뒤에 나오는 Book()은 생성자(Constructor)라고 불리는 녀석이다. 

Book science = new Book()은 즉 science라는 책 객체를 만든다는 의미인 것이다.

생성자얘기는 나중에 하고 우선 객체를 생성할 때 메모리에 어떻게 동작되는지 알아보자.


2. 객체 생성시 메모리 구조(heap영역)

살짝 복습하면 static이라고 붙은 메서드를 로딩하는데 거기서 제일 먼저 로딩되는 것이 main메서드이다. 위의 코드를 예를 들어 Test class의 main메서드가 제일 먼저 메모리에 로드돼서 호출된다.

호출되면 stack 영역에 들어가는데 이 메인메서드 안에는 Book science라는 변수가 선언돼있다. 

이때 science라는 변수를 참조변수라고 한다.(참조변수이긴 하지만 동시에 지역변수이기도 하다)

참조변수는 주소값을 저장한다.

C언어의 포인터 생각하면 된다.

출처 : [Java] 참조 타입과 참조 변수 :: 불곰 (tistory.com)

 

 

Book science를 선언하고 new 예약어와 함께 Book()이라는 생성자를 호출하면 Heap영역이라는 메모리 공간에 science라는 객체가 하나 생성된다. 

science라는 참조변수는 Heap 영역에 있는 science객체의 주소를 가리킨다.

 

science 객체 안에는 이런식으로 객체가 만들어져있고 science라는 참조변수는 Book객체(science)의 주소를 가리킨다.

여기서 getTitle()이라는 메서드는 실제 위치는 method 영역에 들어있지만 getName() 메서드의 주소로 메서드 영역의 getTitle()과 연결돼있다.

최종적으로 정리하면 Book science = new Book()이라고 하면 heap영역에 science객체(인스턴스)가 생성되고 science라는 참조변수는 heap영역의 science 객체(인스턴스)의 주소를 가리킨다

 

이렇게 객체를 생성하고 나면 그 객체의 이름인 참조변수를 이용해 객체 변수와 메서드를 사용할 수 있다

 

위의 예문 처럼 science.title 이렇게 도트 연산자를 이용해  각 객체의 객체변수와 메서드에 접근할 수 있게 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
        science.title="개미와배짱이";
        System.out.println(science.title);  //개미와배짱이 출력
        System.out.println(science.getTitle()); //개미와배짱이 출력
    }
}

 

앞에서 봤던 아래 예문도 객체를 이용하면 hello메서드를 static 예약어 없이 호출가능하다

 

*static 포함한 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		System.out.println(hello(a));
		System.out.println(a);
	

	}
	public static int hello(int a) {
		a=7;
		return a;
	}
}

 

*static을 사용하지 않은 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		Test test1 = new Test();
		System.out.println(test1.hello(a));
		System.out.println(a);
	

	}
	public int hello(int a) {
		a=7;
		return a;
	}
}

3. 생성자(Constructor)

Book science = new Book();에서

new 예약어 뒤에 붙은 Book()을 생성자라고 한다

 

생성자가 하는 일은 객체(인스턴스)를 heap영역에 생성하고 클래스 안에 Book() 생성자의 {}중괄호를 호출하는 역할을 하는데 객체가 생성될 때 객체 변수 값들을 초기화하는 역할도 한다

즉, science의 title과 english의 title은 다르게 설정된다는 것이다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

 

생성자는 객체를 생성할 때만 호출되는데 생성자 이름은 클래스 이름과 같고 반환값이 없다

생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어주는데 이렇게 자동으로 생성되는 생성자를 기본 생성자(default constructor)이라고 한다

 

개발자가 매개변수가 있는 생성자를 따로 만들면 자동으로 기본 생성자가 생성이 되지 않아 기본생성자를 만들어줘야 한다

아래에 public Book(String title){}이 바로 매개변수가 있는 생성자이다

 

이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로딩이라고 한다

 

자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있는데 이를 오버로딩이라고 한다

 

아래에 나오는 this라는 예약어는 객체 자신을 가리키는 예약어인데 우선 이런게 있다고 알고 넘어가자.

 

아무튼 자바의 한 클래스내에 생성자가 두 개 이상이 있으면 인스턴스를 생성할 때 원하는 생성자를 골라서 만들 수 있다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자
  public Book(String title) {
  this.title=title;
  } 

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

4. 접근제어자(access modifier)

자바에서는 예약어를 사용해서 클래스 내부의 변수, 메서드, 생성자에 대한 접근 권한을 지정할 수 있다.

이런 예약어를 접근 제어자라고 한다

접근제어자에는 private, protected, default, public 이렇게 4종류가 있다

 

다른 건 그냥 넘어가고 private만 살펴보자

출처  : 19편. 제어자(Modifiers) (hexabrain.net)

 

 

위 코드의 객체 변수 String title에 접근 제어자를 private으로 바꾸면 동일한 클래스를 제외하고는 이 변수에 직접적으로 접근할 수 없다

그래서 이를 접근하기 위해서는 메서드를 만들면 된다.

 

직접적으로 접근을 할 수 없으니 Book 제목을 받아오거나 지정할 수 있도록 메서드를 사용한다. 

package test;

class Book {
  private String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  public void getTitle(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        //science.title="바보"; //오류발생 //접근 불가
        science.getTitle("안녕");
        System.out.println(science.getTitle());
    }
}

 

정보처리기사 실기에서는 어차피 거의 대부분이 동일한 클래스로 나오므로 사실 잘 몰라도 상관없다

위의 코드는 getTitle이라는 메서드가 오버로딩돼있는 것인데

getTitle을 호출할 때 매개변수가 없으면 public String getTitle()을 호출하는 것이고

매개변수가 있으면 public String getTitle(String title)을 호출하는 것이다

 


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. 객체지향 프로그래밍

2. 클래스

3. 메서드

4. 자바의 메모리 구조와 변수


1. 객체지향 프로그래밍

자바는 객체지향 언어라고 많이들 들어는 봤을 것이다.

객치지향이라고 하면 절차지향과 대조되는데 절차지향의 대표적인 언어가 C언어이고 객체지향의 대표적인 언어가 Java이다

절차지향은 말 그대로 순서대로 읽어야하는 것이고 객체지향은 그와 반대되는 개념이라 생각하면 된다. 

순서가 절차적으로 진행되는 것이 아니라 그때 그때 필요한 것이 실행되는 것이다.

대충만 생각해봐도 객체지향이 뭔가 더 효율적인 느낌이다

a부터 z까지 진열된 책장이 있다고 생각해보자.

절차지향은 dragon이라는 책을 찾기 위해서 a부터 절차적으로 찾아야한다.

반면에 객체지향은 dragon이라는 책을 바로 검색해서 찾는다.

완벽하진 않지만 대충 생각하면 이렇다.

대충 알았으니 이제 객체지향에 대해 더 알아보자.

우선 객체란 뭘까?

 

1) 객체란?

물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신과 다른 것을 식별가능한 것이다.

사람, 자동차, 건물 등의 눈에 보이는 사물은 모두 객체라고 할 수 있으며 눈에 안보이는 주문, 생산, 관리 등 어떤 행동을 나타내는 단어도 객체가 될 수 있다.

출처 : [자바, Java] 객체(Obejct)란? (tistory.com)

 

 

2) 객체지향 프로그래밍

각 요소들을 객체(Object)로 만든 후, 객체들을 조립해서 소프트웨어를 개발하는 기법이다.
쉽게 생각해서 컴퓨터로 예를 들면 컴퓨터의 모든 부품을 적절히 연결하고 조립해서 컴퓨터가 제대로 작동하도록 만드는 것이라고 볼 수 있다. 

"학생이 밥을 먹는다"라는 예문을 생각해보자.
학생이라는 객체와 밥이라는 객체가 협력해서 문장이 구현이 된다.
객체 지향 프로그래밍도 마찬가지로 각 객체가 어떤 기능을 제공하고 객체 간 협력을 어떻게 구현할 것인지 생각해야한다. 

출처 : Do it! 자바 프로그래밍 입문-박은종


2. 클래스

앞서 1탄에서 자바 프로그램은 클래스 단위이기 때문에 자바 프로그램을 만드는 것은 자바 클래스를 만드는 것과 같다고 하였다. 그렇다면 클래스는 뭘까

클래스는 공통된 연산을 갖는 객체의 집합이다

C언어에서 구조체랑 비슷하다.

C언어에서 구조체는 여러가지 자료형을 한번에 관리하기 위해 사용한 것이라면 Java에서 클래스는 여러가지 자료형과 함수(자바에서는 메서드라고 부름)를 한번에 관리하기 위해서 사용한다.

 

간단하게 예를 들어 생각해보자.10이라는 자료를 변수로 저장하고 싶다면 자료형을 뭘로 해야할까?int형 같은 정수형 자료형을 사용하면 될 것이다.그렇다면 책이라는 것을 변수로 저장하려면 자료형을 뭘로 해야할까?그럴때 나오는 개념이 바로 클래스이다.

 

책이라는 객체안에는 제목, 가격, 출판사, 저자등의 다양한 자료들이 들어가 있다. 

자바에서는 아래와 같이 클래스라는 녀석을 이용해서 서로 다른 자료형들과 함수(자바에서는 메서드)를 한꺼번에 담는다.

public class Book{
 public String title;
 public int price;
 public String company;
 public String author;
}

위의 예시에서 title, price, company, author같이 클래스안에 들어있는 변수를 필드 또는 멤버변수 또는 객체변수 또는 속성 또는 인스턴스 변수라고 한다

 

<Book>

String title int price String company String author

위와 같은 느낌으로 생성된다.


3. 메서드

클래스에 포함되는 함수를 메서드라고 한다

일단 함수는 C언어에서도 봤었다.

형태는 거의 동일하다

 

아래 예시에서 

int는 반환값

add는 메서드 이름

int a, int b는 매개변수이다.

int add(int a,int b) {
  return a+b;
}

4. 자바의 메모리 구조와 변수

 

아래 예문의 출력 결과를 예상해보자.

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		System.out.println(hello(a));
		System.out.println(a);
	

	}
	public static int hello(int a) {
		a=7;
		return a;
	}
}

C언어때의 예문과 거의 동일하다

 

혹시나 뭔소리인지 모르겠다면 아래 링크에 설명을 보고오는 것이 좋다.

2023 정보처리기사 실기-비전공자용 C언어 요약 3탄(함수, 포인터) :: 잡코딩 정보 블로그 (tistory.com)

 

메서드를 호출함으로써 a의 값이 변경된 줄 알았는데 System.out.println(a)를 보니 a의 값이 바뀌지 않았다. 그 이유는 main메서드의 변수 a와 hello()메서드의 변수 a는 다른 a이기 때문이다. 즉 각기 다른 지역의 지역변수이다.

 

이제 자바의 메모리 구조를 알아보자.

자바에서는 자바 가상 머신(JVM)이라는 녀석이 있는데 이 녀석은 자바 프로그램 실행 환경을 만들어 주는 소프트웨어 이다. 자바 코드를 컴파일하여 자바 가상 머신 환경에서 실행되게 만들어준다.

이 때 컴파일은 0과 1밖에 이해못하는 컴퓨터를 이해시키기 위해 개발자가 만든 소스코드를 기계어로 바꿔주는 작업을 말한다.

JVM이라는 녀석이 위와 같은 예문일 경우 Test라는 이름의 클래스를 찾는다.

그 다음 static 예약어가 붙은 메서드를 메모리에 로딩한다.

C언어에서 배웠다시피 static이 붙으면 지역변수처럼 중간에 소멸되지 않고 프로그램이 종료될 때 까지  계속 메모리에 남아 있다.

 

프로그램이 실행되기 전 Method 영역에 main 메서드와 hello 메서드가 메모리에 로딩되며 제일 우선적으로 main메서드가 호출되면 호출된 정보가 stack 영역으로 들어가서 프로그램이 시작된다.

 

위 예문에서는 hello라는 메서드에 static 예약어가 붙어있기 때문에 main메서드에서 hello 메서드를 사용할 수 있는 것이다

 

아무튼 static이 있으니 프로그램 시작전에 메모리에 로딩돼있고 main부터 실행된다는 것만 알면 된다


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

 

[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

 


 

 

Java 공부하기는 싫고 대충이라도 알아야겠다싶으신분만 보세요

찍먹용이라 아주 간단하게만 적혀져 있습니다

대충 읽어보시고 Java 기출문제 풀어보시면 될 것 같습니다

C언어보다는 난이도가 낮게 출제되므로 시간이 없으시다면 java를 통해 합격전략을 세우시는 것도 좋습니다.

 

기본적인 프로그래밍은 안다고 전제하고 java의 특이한 부분에 대해서 중점적으로 설명할 예정이니 기본적인 프로그래밍도 모르시는 분들은 C언어 요약 먼저 보고오시면 좋습니다

비전공자용 C언어 요약 1탄


목차

1. Java의  기본 구조

2. 변수와 자료형


1. Java의 기본 구조

보통 일반적인 자바 소스코드는 다음과 같은 형태로 만들어진다.
클래스명.java

// 클래스 블록 
public class 클래스명 {

    // 메서드 블록 
    public static void main(String[] args) {
        System.out.println("Hello java");
    }

//public이 접근제어자
//static이 정적메서드와 변수
//void가 리턴자료형
//main은 메서드명
//String[] arg는 메서드의 매개 변수
}

소스코드의 가장 바깥쪽 영역은 클래스 블록이다. 클래스명은 원하는 이름으로 지을 수 있다. 단, 클래스명은 소스파일의 이름(클래스명.java)과 동일하게 사용해야 한다.

 

자바 프로그램은 클래스 단위이기 때문에 자바 프로그램을 만드는 것은 자바 클래스를 만드는 것과 같다.

 

이제 메서드블록을 살펴보자. 

 

1) 접근 제어자

메서드 블록 부분에서 public이라고 되어 있는 부분은 접근제어자라고 하는데 이 자리에는 public, private, protected 또는 아무것도 오지 않을 수 있는데 지금은 이런게 있다고만 알고 넘어가자.

 

2) 정적메서드와 변수

그 다음은 static 키워드가 올수도 있고 오지 않을 수도 있다는 의미이다. static 이라는 키워드가 붙게 되면 static 메서드가 되는데 이것도 일단 이런게 있다고 알고 넘어가자.

 

3) 리턴자료형

그 다음 void는 메서드가 실행된 후 리턴되는 값의 자료형을 의미한다.

리턴값이 있을 경우에는 반드시 리턴 자료형을 표기해야 하며 만약 리턴값이 없는 경우라면 void 로 표기해야 한다. 이 항목은 둘 다 생략할 수는 없고 void 또는 리턴자료형이 반드시 있어야만 한다. 

 

4) 메서드 

메서드는 클래스에 포함되는 함수를 말하며 메서드명은 원하는 이름으로 지을수 있다.

메서드 명 이후의 괄호() 안의 값들은 메서드의 입력 인자를 뜻한다.

입력 인자의 갯수는 제한이 없으며 입력 인자는 "입력자료형"+"매개변수명" 형태로 이루어 진다.

 

String[] args는 메서드의 매개 변수이다. String[]은 배열 자료형이란 의미이고, args는 String[]자료형에 대한 변수명이다. args라는 이름은 인수를 의미하는 arguments의 약어로 관례적인 이름이다. args 대신 다른 이름을 사용해도 상관없다.

 

클래스내에는 이러한 메서드를 여러개 만들수 있다.

 

 

출처  : 02-01 자바 소스코드의 구조 - 점프 투 자바 (wikidocs.net)

 

 

뭔소린지 모르겠으면 일단 넘어가자.

여기서는 일단 자바라는 언어는 코드가 클래스라고 하는 것에 우선 둘러쌓여야하고 C언어와 마찬가지로 역시 main이라고 적혀있는 것을 가장 먼저 실행한다는 것만 알면 된다.

 

그리고 System.out.println은 그냥 C언어 printf와 동일하다고 생각해주면 된다.

괄호안에 있는 것을 출력해주는 역할을 한다.(C언어와 다른 점은 println은 개행이 된다는 점이다)

C언어와 동일하게 개행이 되지 않게 하면 System.out.print("안녕"); 해주면 된다


2. 변수와 자료형

기본적으로 변수는 C언어에서 배웠던 개념과 동일하다

다른게 있다면 자료형이다

 

int, double 이런 것들이 기본 자료형이고 클래스형, 배열형 뭐 이런게 참조 자료형이다

참조 자료형은 쉽게 생각해서 기본 자료형을 사용자의 편의를 위해 입맛대로 변형한 것이라고 생각하면 된다

특히 참조 자료형에는 String이라는 것이 있다.

C언어에서는 문자열을 변수에 저장하고자 할 때 배열이나 포인터를 사용했었다. 하지만 자바에서는 String이라는 자료형이 존재한다. String으로 문자열을 받을 수 있는 것이다.

 

*String은 char의 배열로 구현된 참조 자료형이다.

 

아무튼 여기서는 기본 자료형외에도 참조 자료형이라는게 존재하며 문자열을 string이라는 자료형으로 간편하게 저장받을 수 있다 정도만 알고 넘어가면 될 듯 하다


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

+ Recent posts