Loading the catalog…
Loading the catalog…
이번 블로그에서는 자바의 클래스와 객체에 대해 공부해보겠습니다. 객체 지향 언어 객체 지향 언어는 실세계의 객체를 프로그램 내에서 표현하기 위해 클래스와 객체를 도입하였다. 객체 지향 언어의 특성 캡슐화 캡슐화란 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것으로 객체의 본질적인 특징이다. 객체는 캡슐화가 기본 원칙이지만 외부와의 접속을 위해 몇 부분만 공개 노출한다. 자바에서 객체는 클래스라는 캡슐을 사용하며, 필드(멤버 변수)와 메소드(멤버 함수)로 구성된다. 클래스 선언: class Animal { String name; int age; void eat() {...} void speak() {...} void love() {...} } 클래스 모양으로 만들어진 객체: String name "Lion" int age 4 void eat(); void speak(); void love(); 상속 자바의 상속은 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장하는 개념이다. 자바에서 부모 클래스를 슈퍼 클래스라고 부르며 자식 클래스를 서브 클래스라고 부른다. 상속은 슈퍼 클래스의 필드와 메소드를 물려받아 코드를 재사용함으로써, 코드 작성에 드는 시간과 비용을 줄인다. class Animal { String name; int age; void eat() {...} void sleep() {...} void love() {...} } class Human extends Animal { String hobby; String job; void work() {...} void cry() {...} void laugh() {...} } 다형성 다형성은 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것을 말한다. 예를 들어, 강아지, 고양이, 닭 클래스는 Animal 클래스를 상속받고, 소리내기 메소드를 각각 다르게 구현하였다. 이것은 슈퍼 클래스에 구현된 메소드를, 서브 클래스에서 동일한 이름으로 자신의 특성에 맞게 다시 구현하는 이른바 메소드 오버라이딩으로 불린다. 다형성의 또 다른 사례는 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러 개 만드는 메소드 오버로딩이 있다. 객체 지향 언어의 목적 객체 지향 언어는 절차 지향 언어의 단점을 보완하고 다음의 목적을 달성하기 위해 탄생하였다. 1. 소프트웨어의 생산성 향상 2. 실세계에 대한 쉬운 모델링 자바 클래스 만들기 클래스의 구성 클래스의 구성 요소를 멤버라고 부르며, 멤버는 필드와 메소드 두 가지다. public class Circle { public int radius; public String name; public Circle() { } public double getArea() { return 3.14*radius*radius; } } 클래스 선언, class Circle 이 코드는 이름이 Circle인 클래스를 선언한다. class 키워드와 클래스 이름으로 선언하고 중괄호 안에 필드와 메소드를 모두 작성한다. 필드와 메소드 객체 내에 값을 저장할 멤버 변수를 필드라고 부른다. radius와 name이 이에 해당한다. 메소드는 함수이며 객체의 행동을 구현한다. getArea() 메소드는 Circle 객체의 반지름 정보를 이용하여 면적을 계산하여 알려준다. 접근 지정자, public Circle이나 필드, 메소드에 붙은 public을 접근 지정자라고 한다. public은 다른 클래스에서 활용하거나 접근할 수 있음을 선언한다. 접근 지정자를 생략할 때 디폴트 접근이라고 부르며, 접근 지정자는 뒤에서 자세히 다룬다. 생성자 클래스의 이름과 동일한 메소드를 특별히 생성자라고 한다. 객체가 생성될 때 자동으로 호출되는 특별한 메소드이다. new 연산자와 객체 생성, 그리고 레퍼런스 변수 앞서 작성한 Circle 클래스의 객체를 생성하고 활용해보자. public static void main(String args[]) { Circle pizza; pizza = new Circle(); pizza.radius = 10; pizza.name = "자바피자"; double area = pizza.getArea(); } 레퍼런스 변수 선언 객체를 생성하기 전, 객체를 가리킬 레퍼런스 변수를 먼저 선언한다. 타입의 객체를 가리킬 레퍼런스 변수 pizza를 선언하는 문장이다. Circle pizza; 이 선언문으로는 Circle 타입의 객체가 생성되지 않는다. 이는 객체에 대한 주소를 가지는 변수일 뿐 객체 자체는 아니다. 객체 생성 반드시 new 연산자를 사용하여 다음과 같이 객체를 생성한다. pizza = new Circle(); 객체 멤버 접근 접근을 위해서는 객체 레퍼런스.멤버 이런식으로 접근한다. pizza.radius = 10; int r = pizza.radius; double area = pizza.getArea(); 생성자 생성자의 개념과 목적 생성자는 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드이다. 생성자 선언 및 활용 public class Circle { int r; String name; public Circle() { radius = 1; name = ""; } public Circle(int r, String n) { radius = r; name = n; } } 생성자의 이름은 클래스와 동일하다. 생성자는 여러 개 작성할 수 있다. 생성자는 new를 통해 객체를 생성할 때 한 번만 호출된다. 생성자에 리턴 타입을 지정할 수 없다. 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다. 기본 생성자 기본 생성자란 매개변수와 실행 코드가 없어 아무 일도 일어나지 않고 단순 리턴하는 생성자이다. class Circle { public Circle() { } } 기본 생성자가 자동으로 생성되는 경우 생성자가 없는 클래스는 있을 수 없다. 그러므로 생성자가 하나도 없는 경우, 컴파일러는 기본 생성자를 자동으로 생성한다. this 레퍼런스 this는 객체 자신을 가리키는 레퍼런스이다. this의 기초 개념 this는 현재 객체 자신에 대한 레퍼런스이다. 보다 정확히 말하면 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스이다. public class Circle { int radius; public Circle(int r) { this.radius = r; } } this는 현재 객체에 대한 레퍼런스이므로, this.radius는 현재 객체의 멤버 radius에 접근한다. this의 필요성 앞의 Circle 클래스에서 메소드 getRadius()는 다음과 같이 this를 사용하지 않았다. 클래스 내에서 멤버 radius를 접근할 때 굳이 this.radius로 할 필요가 없다. 그렇다면 this는 언제 필요한가? 매개변수의 이름은 그 자체로서 코드를 읽는 사람에게 그 용도를 나타내므로, 적합한 이름을 붙이는 것은 매우 중요하다. 그래서 Circle(int r) 생성자의 매개변수를 r 대신 다음과 같이 radius로 변경하는 것이 좋다. 하지만 이렇게 변경하면 2개의 radius는 모두 매개변수 radius를 접근 하기 때문에, 멤버 radius를 변경하지 못한다. 이럴 때 this를 사용하면 된다. public Circle(int radius) { this.radius = radius; } this()로 다른 생성자 호출 public class Book { String title; String author; void show() { System.out.println(title + " " + author); } public Book() { this("", ""); } public Book(String title) { this(title, "작자미상"); } public Book(String title, String author) { this.title = title; this.author = author; } } this사용 시 주의할 점 반드시 생성자 코드에서만 호출 반드시 같은 클래스 내 다른 생성자 호출할 때 사용 생성자의 첫문장이어야함 객체 배열 자바에서는 객체를 원소로 하는 배열도 만들 수 있다. Circle [] c; c = new Circle[5]; 메소드 활용 메소드는 객체의 동작을 정의한다. 기본적인 형태는 다음과 같다. 반환형 메소드이름(매개변수) { 실행할 코드 } 메소드를 호출하면 매개변수로 값을 전달할 수 있고, return을 통해 결과를 반환할 수 있다. 메소드 오버로딩 자바에서는 같은 이름의 메소드를 여러 개 정의할 수 있다. 단, 매개변수의 개수나 타입이 달라야 한다. int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } 이것을 메소드 오버로딩(Method Overloading)이라고 한다. 반환형만 다른 것은 오버로딩이 될 수 없다. // 불가능 int add(int a, int b) double add(int a, int b) 객체의 소멸과 가비지 컬렉션 자바에서는 객체를 직접 삭제하는 기능을 사용하지 않는다. 객체를 더 이상 참조하는 변수가 없으면 해당 객체는 가비지(Garbage)가 된다. 자바의 가비지 컬렉터(Garbage Collector)는 이러한 객체를 자동으로 찾아 메모리를 회수한다. 예를 들어, Car car = new Car(); car = null; 이후 기존 Car 객체를 가리키는 참조가 없다면 해당 객체는 가비지가 될 수 있다. 따라서 자바에서는 C/C++처럼 개발자가 직접 메모리를 해제할 필요가 없다. 접근 지정자 클래스의 필드나 메소드에 다른 클래스가 접근할 수 있는 범위를 지정할 수 있다. 대표적인 접근 지정자는 다음과 같다. 접근 지정자 접근 범위 private : 같은 클래스 default : 같은 패키지 protected : 같은 패키지 + 상속 관계 public : 모든 클래스 private int speed; private으로 선언하면 해당 클래스 외부에서 직접 접근할 수 없다. 따라서 필요한 경우 메소드를 통해 접근하도록 만든다. public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } 이처럼 데이터를 직접 노출하지 않고 메소드를 통해 접근하는 방식은 객체지향 프로그래밍에서 중요한 개념이다. static 멤버 static이 붙은 필드나 메소드는 객체에 소속되는 것이 아니라 클래스에 소속된다. 일반적인 멤버는 객체마다 각각 존재한다. 반면 static 멤버는 클래스에 하나만 존재하며 여러 객체가 공유한다. class Student { static int count = 0; } 객체를 여러 개 만들어도 count는 하나를 공유한다. 또한 static 메소드는 객체를 생성하지 않고 클래스 이름으로 호출할 수 있다. Student.someMethod(); static 메소드의 특징 static 메소드에서는 일반적인 인스턴스 멤버를 직접 사용할 수 없다. 왜냐하면 static 메소드는 특정 객체에 속하지 않기 때문이다. final final은 변경할 수 없도록 만드는 키워드이다. 변수에 final을 사용하면 값을 변경할 수 없다. final int MAX = 100; 이후 MAX = 200; 처럼 값을 변경할 수 없다. 따라서 final 변수는 상수(constant)를 표현할 때 자주 사용한다. 예제 자바 클래스를 만들어보자. 다음 main() 메소드를 실행하였을 때 예시와 같이 출력되도록 TV 클래스를 작성하라. class TV { private String brand; private int inch; private int price; public TV(String brand, int inch, int price) { this.brand = brand; this.inch = inch; this.price = price; } public void show() { System.out.println(brand + "에서 만든 " + price + "만원짜리 " + inch + "인치 TV"); } } public class TVTest { public static void main(String[] args) { TV tv = new TV("Samsung", 50, 300); tv.show(); } } 3. Grade는 한 학생의 점수를 나타내는 클래스이다. 이름과 3개의 과목 점수를 각각 입력받아 Grade 객체를 생성해서 성적 평균을 출력하는 main()과 실행 예시는 다음과 같다. main()을 포함하는 Grade 클래스를 작성하라. import java.util.Scanner; class Grade { private String name; private int java; private int web; private int os; public Grade(String name, int java, int web, int os) { this.name = name; this.java = java; this.web = web; this.os = os; } public double getAverage() { return (java + web + os) / 3.0; } } public class GradeTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("이름, 자바, 웹프로그래밍, 운영체제 순으로 점수 입력>>"); String name = scanner.next(); int java = scanner.nextInt(); int web = scanner.nextInt(); int os = scanner.nextInt(); Grade st = new Grade(name, java, web, os); System.out.println(name + "의 평균은 " + st.getAverage()); scanner.close(); } } 5. 노래 한 곡을 나타내는 Song 클래스를 작성하라. Song 클래스의 필드는 다음과 같다. 노래의 제목 title 가수 이름 singer 발표 년도 year 가수 나라 lang 또한 Song 클래스에는 다음 메소드들이 있고, main()의 실행 결과는 다음과 같다. 노래 제목, 가수 이름, 발표 년도, 가수 나라의 4개의 매개변수를 받아, 객체의 각 필드를 초기화하는 생성자 노래 정보를 출력하는 show() 메소드 main() 메소드는 "가로수 그늘 아래 서면", "이문세", 1988, "한국"을 매개변수로 하여 Song 객체를 생성하고, 이 객체의 show()를 호출하여 노래 정보를 다음과 같이 출력한다. 1988년 한국의 이문세가 부른 가로수 그늘 아래 서면 class Song { private String title; private String singer; private int year; private String lang; public Song(String title, String singer, int year, String lang) { this.title = title; this.singer = singer; this.year = year; this.lang = lang; } public void show() { System.out.println(year + "년 " + lang + "의 " + singer + "가 부른 " + title); } } public class SongTest { public static void main(String[] args) { Song song = new Song( "가로수 그늘 아래 서면", "이문세", 1988, "한국" ); song.show(); } } 7. 1개의 메모 정보를 담는 Memo 클래스를 작성하라. Memo는 생성자를 비롯하여 다음과 같은 멤버를 갖는다. String 타입의 name, content 필드 // 메모 작성자, 메모 시점, 메모 텍스트 boolean isSameName() // 메모 작성자가 같으면 true 리턴, 아니면 false 리턴 String getName() // 메모 작성자 이름 리턴 void show() // 메모 출력 int length() // 메모 텍스트의 길이 리턴 Memo 객체를 생성하고 다루는 main() 함수와 실행 예시는 다음과 같다. class Memo { private String name; private String time; private String content; public Memo(String name, String time, String content) { this.name = name; this.time = time; this.content = content; } public boolean isSameName(Memo other) { return name.equals(other.name); } public String getName() { return name; } public void show() { System.out.println(name + ", " + time + " " + content); } public int length() { return content.length(); } } public class MemoTest { public static void main(String[] args) { Memo a = new Memo("유승민", "10:10", "자바 과제 있음"); Memo b = new Memo("박재현", "10:15", "시키고도 어려운 연습가요!"); Memo c = new Memo("김정미", "11:30", "사랑하는 사람이 생겼어요."); a.show(); if (a.isSameName(b)) System.out.println("동일한 사람입니다."); else System.out.println("다른 사람입니다."); System.out.println(c.getName() + "가 작성한 메모의 길이는 " + c.length()); } } 9. 숨겨진 숫자에 가장 가까운 수를 제시하는 사람이 이기는 예측 게임을 작성해보자. 1~100 범위의 정수를 랜덤하게 1개 생성하여 게임에 참여한 선수들에게 숫자를 추측하게 한 후 숨겨진 답에 가장 가까운 선수가 승리하며 1점을 부여한다. 게임이 여러 번 반복되어 승점이 많은 사람이 최종 승자가 된다. 게임에 참여하는 사람을 Player 클래를 만들고 이곳에 선수 이름과 누적 점수를 저장한다. main()을 포함하는 게임 프로그램의 클래스는 GuessGame으로 하며 실행 예시는 다음과 같다. import java.util.Scanner; class Player { String name; int score; public Player(String name) { this.name = name; this.score = 0; } } public class GuessGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("*** 예측 게임을 시작합니다. ***"); System.out.print("게임에 참여할 선수 수>>"); int n = scanner.nextInt(); Player[] players = new Player[n]; for (int i = 0; i < n; i++) { System.out.print("선수 이름>>"); players[i] = new Player(scanner.next()); } while (true) { int hiddenAnswer = (int)(Math.random() * 100) + 1; System.out.println( "1~100사이의 숫자가 결정되었습니다. 선수들은 맞추어 보세요." ); int[] numbers = new int[n]; for (int i = 0; i < n; i++) { System.out.print(players[i].name + ">>"); numbers[i] = scanner.nextInt(); } int minDiff = Integer.MAX_VALUE; int winner
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
[UNION] 클래스와 객체. 이번 블로그에서는 자바의 클래스와 객체에 대해 공부해보겠습니다. 객체 지향 언어 객체 지향 언어는 실세계의 객체를 프로그램 내에서 표현하기 위해 클래스와 객체를 도입하였다. 객체 지향 언어의 특성 캡슐화 캡슐화란 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것으로 객체의 본질적인 특징이다. 객체는 캡슐화가 기본 원칙이지만 외부와의 접속을 위해 몇 부분만 공개 노출한다. 자바에서 객체는 클래스라는 캡슐을 사용하며, 필드(멤버 변수)와 메소드(멤버 함수)로 구성된다. 클래스 선언: class Animal { String name; int age; void eat() {...} void speak() {...} void love() {...} } 클래스 모양으로 만들어진…
Open source