다른 프로그래밍 언어에서 OOP를 배우는 데 차이가 있습니까? [닫은]


9

OOP를 배우고 싶습니다. 나는 파이썬을 알고 OOP에 대해 거의 알지 못한다.

하지만 포럼에서 "learn OOP"를 검색 할 때 "Python은 너무나 새롭기 때문에 Python에서 OOP를 배울 수없는 이유입니다. Java를 배우고 Java에서 OOP를 이해해야합니다"

사실인가요? 다른 프로그래밍 언어에서 OOP를 이해하는 데 차이가 있습니까? Java, C #, C ++, Perl 또는 Python에서 배우는 것처럼?


12
"Python은 너무나 새롭기 때문에 Pyton에서 OOP를 배울 수 없습니다. Java를 배우고 Java에서 OOP를 이해 합니다." 파이썬을 사용하여 OOP를 배우고 싶다면 이유가 없습니다. 해봐!
FrustratedWithFormsDesigner

13
Python이 Java보다 오래되지 않습니까? 내 머리 꼭대기에서 나는 그것이 믿지만 몇 년이 지나면 나올 수 있다고 생각합니다.
Jimmy Hoffa

2
@JimmyHoffa 사실입니다. Wikipedia에 따르면 91 대 95.
Evicatos

2
@JimmyHoffa : 어서, 사실이 될 수 없습니다! 우리는 모두 Java가 최초의 OO 언어라는 것을 알고 있습니다. "Sun은 Java의 참신함을 크게 예고합니다." — 질문은 ... 왜 OO를 배우기로 결심 했습니까? 그것은 곧 당신에게 강요 될 것입니다. 파이썬은 여러 프로그래밍 패러다임의 이점에 대한 통찰력을 얻는 훌륭한 출발점입니다.
leftaroundabout

답변:


10

이론적 인 구조 인 객체는 매우 간단합니다. 데이터, 함수 또는 둘 다를 저장하는 구조입니다. 이러한 구조는 파이썬 외부의 대부분의 언어에서 암시적인 "자기"감각을 가지고 있다는 아이디어입니다. 이를 "설명자"라고하며 데이터 (변수 또는 필드)와 함수 (일반적으로 메서드라고 함)를 해당 특정 개체에 바인딩하는 자체 참조 지점을 개체에 제공합니다. 아이디어는 더 크고 일반적인 구성이 아닌 특정 인스턴스 (일반적으로 아래에 할당 된 메모리 블록)에 속하는 변수 또는 메소드를 사용한다는 것입니다.

객체 시스템은 상속과 액세스라는 두 가지 큰 범주와 관련하여 다양합니다.

Java 또는 C ++와 같은 일부는 할당 된 오브젝트의 "청사진"역할을하는 클래스를 선언하도록합니다. 이러한 클래스와 해당 객체는 인스턴스화 한 후에는 구조적으로 수정할 수 없습니다. 변수는 변경 될 수 있지만 구조는 정적이라는 의미에서 내용을 재정의 할 수 있습니다. 예를 들어 Java의 HashMap에 새 메소드를 추가 할 수 없습니다. 인터페이스를 확장하거나 (기본적으로 계약으로 사용되는 부분적으로 구현 된 클래스) 해당 클래스의 모든 원래 변수 및 메소드와 함께 필요한 추가 메소드 또는 변수를 가져 오기 위해 서브 클래스를 만들 수 있습니다.

가장 일반적으로 인용되는 Ruby 인 다른 클래스 기반 언어를 사용하면 기존 클래스를 쉽게 열고 원하는대로 메소드를 추가 할 수 있습니다. 이것은 논쟁의 뼈이며 많은 사람들이 매우 위험하다고 생각합니다.

자바 스크립트는 더 느슨합니다. 객체는 변수 나 함수를위한 슬롯 모음에 지나지 않습니다. 프로그래머가 필요하다고 느낄 때마다 변경하거나 덮어 쓸 수 있습니다. 그것들은 다른 물체에 대한 "프로토 타입"으로 임의로 복제되어 모든 능력을 전달할 수 있습니다.

액세스 제어는 다양한 언어 간의 또 다른 큰 차이점입니다.

Java와 같은 일부 언어는 "private"및 "protected"와 같은 액세스 수정자를 매우 엄격하게 적용하여 지정된 변수 또는 메소드를 사용할 수있는 클래스 및 서브 클래스를 정확하게 정의합니다.

파이썬과 같은 다른 메소드는 메소드 또는 변수 이름 앞에 밑줄을 사용하여 그것이 개인임을 표시하는 형식이 덜 공식적입니다.

궁극적으로 파이썬은 객체 지향 방식으로 프로그래밍하기에 완벽하게 합법적 인 언어이며, 다른 언어만큼 엄격하게 강요하지는 않습니다.


할 수 있음 이 질문에 대한 조금 너무 기술적합니다.
Zeroth

@zeroth, 너무 구체적입니다. 'self'(또는 'this') 매개 변수는 보편적이 아닙니다.
Javier

@Javier 이것이 파이썬에서 명시 적이며 다른 곳에서 암시 적이라고 말한 이유입니다.
세계 엔지니어

문제는 OOP 학습 에 관한 것이며 privateJava에 대한 Encapsulation 과 __Python에 대한 밑줄 ( ) 과 같은 특정 개념을 달성하기 위해 언어를 작성하는 방법에 대해 논의하는 것이 상당히 중요합니다. 파이썬의 추상화 수준이 초보자에게는 조금 더 어려울 수 있지만 확실히 불가능하지는 않다고 생각합니다. 자바는 프로그래머를 위해 그것을 철자하여 어떤 개념은 좀 더 쉽게 붙일 수 있습니다.
Derek W

@WorldEngineer 나는 명시 적 / 암묵적 인 것에 대해 이야기하지 않고 (또한 Python은 이것에서 특이하지 않습니다), 단순히 개념으로 존재하는 것에 대해 이야기합니다. 일부 언어는 첫 번째 매개 변수뿐만 아니라 모든 매개 변수에 대해 다형성 디스패치를 ​​수행합니다. 일부는 특정 버전에 대해 다른 힌트를 사용하며 기본 스타일은 인수를 'this'로 권한을 부여하지 않을 수 있습니다.
Javier

18

OOP 원칙을 배우는 것은 언어마다 다르지 않으므로 "OPP를 배우십시오"라는 용어가 "용어의 의미, OOP의 정의 및 사용 이유"를 의미하는 경우 언어는 중요하지 않습니다.

"OOP를 사용하여 개발하는 방법을 배우십시오"라는 의미라면 다른 언어에서는 다르게 처리하지만 모두 동일한 원칙을 공유합니다. 당신이 나와 같은 것이면 그냥하는 것만으로도 가장 잘 배울 것입니다. 객체 지향 측면을 다루는 훌륭한 자습서 또는 책이 포함 된 객체 지향 언어를 선택하십시오. 객체 지향 디자인의 원칙을 가지고 있다면 다른 OO 언어로 사용할 수 있습니다.

"Python은 매우 새롭기 때문에 Pyton에서 OOP를 배울 수 없습니다. Java를 배우고 Java에서 OOP를 이해합니다"

이것은 단지 내 머리를 아프게합니다. 너무 많은 잘못이 한 문장으로 밀려났습니다.

파이썬은 1989 년으로 거슬러 올라갑니다.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

1995 년 자바.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

그 조언의 타당성에 대한 자신의 결론을 그릴 수 있습니다 ...


1
그렇습니다. 그러나 파이썬 1.0은 1994 년이 되어서야 개발되었습니다. 그러나 파이썬에는 OO가 있으며 OO의 개념을 배울 수 있다는 데 동의합니다. 달리 말하면 터무니 없습니다.
chubbsondubs

2
@chubbsondubs 그렇습니다. 여전히 Java 앞에 있습니다! ;)
Izkata 2012

1
간단한 반점을 제공한다는 점에서 클래스 기반 OOP (C ++, Java, Python 등)는 프로토 타입 기반 OOP와는 상당히 다릅니다 (JavaScript는 이것을 사용하는 유일한 언어입니다). 그들은 여전히 ​​OOP이며 동일한 기본을 가지고 있으며 많은 동일한 목표를 제공하지만 많은 사람들이 클래스를 OOP로 간주하는 것의 일부로 생각하지만 JavaScript에는 클래스가 없으며 분명히 객체 지향적입니다.
KRyan

@KRyan : 관심이 있으시다면 Self라는 다른 프로토 타입 기반 OO 언어가 있습니다.
Jerry Coffin

ActionScript에는 프로토 타입과 클래스가 모두 있습니다.
OrangeDog

8

나는 당신이 인용하는 사람이 단순히 언어 쇼비니즘을 보여주는 것이라고 생각합니다.

실제로 OOP의 개념 과 OOP의 구현 에는 차이가 있습니다. OOP 개념 중 일부를 잘 이해하면 이해하기 쉽습니다.

많은 프로그래머들이 몇 가지 유사한 언어에 익숙해 져서 능력을 확장하거나 한동안 능력을 발휘하지 않아도됩니다.

그렇다면 실제로 파이썬 은 OOP 의 개념 을 가르쳐 줄 까요?

나는 당신이 자기 주도 학습에서 일반적으로 탐구하지 않는 것들을 시도하도록하는 적절한 학습 지원이 있다면 가능하다고 말할 것입니다. 어떤 책이나 멘토가 가장 좋습니다. 마크 루츠 (Mark Lutz)는 파이썬에 대해 매우 심층적이고 상세하며 매우 훌륭한 책을 씁니다. 더 많은 것을 배우고 배우도록 강요 할 것이기 때문에 그의 책을 추천합니다.

기억해야 할 것은 파이썬의 길은 유일한 길이 아니며 유일한 올바른 길도 아니라는 것입니다. 프로그래밍 패러다임이 많을수록 프로그래머가 더 좋아집니다. Python이 OOP를 수행하는 방식은 C ++ 또는 Java가 수행하는 방식이 아니라 개념이 잘 전달됩니다.


4
OOP와 관련하여 Java와 C ++는 Python과 다른만큼 서로 다릅니다.
로봇 고트

어느 정도까지는 언어 디자인 지식과 다른 제약 조건이 바뀌었기 때문입니다.
Zeroth

솔직히 말해서 OOP 개념의 90 %는 그들 사이에서 거의 보이지 않게 전달됩니다.
Zeroth

예, 동의합니다. OOP와 관련하여 Java와 C ++가 "동일"하다고 생각하는 것은 약간 재미있다.
로봇 고트

4

예, OOP 구현은 매우 다릅니다. 이론과 원리는 동일하지만 많은 사람들이 Java와 C ++가하는 "실제 OOP"만을 고려하여 "언어에 구애받지 않는"것으로 여겨지지만 실제로는 클래스 기반의 정적으로 유형화 된 언어를 가정합니다. .

그렇다고해서 그러한 참조가 나쁘거나 제한적이라는 것은 아닙니다. 예를 들어, "gang of four"(GoF) 저널 인 "디자인 패턴 : 재사용 가능한 객체 지향 소프트웨어의 요소"는 "정적 클래스 기반 OOP"를 의미 할 때 "OOP"라고하는 훌륭한 작품의 대표적인 예입니다.

내 의견으로는 : 그렇습니다. Python, Javascript, C 및 기타 여러 언어에서 많은 OOP를 배울 수 있습니다. 그러나 "OOP 경험"을 요구할 때 일부 사람들 (미래의 고용 주일 수도 있음)은 Java / C ++ / C #을 의미합니다. 따라서 다른 견해도 확인하는 것이 좋습니다.

(그리고 이것들은 OOP의 두 가지 '유형'이 아닙니다 ....)


2
아이러니하게 정적 인 클래스 기반 OOP는 Alan Key가 원래 OOP로 제안한 것이 아닙니다. 그러나 "학습"OOP의 많은 엄격하게 특정 OOP의 된 구현에 한정되지 않고, 디자인 / 코딩 감지 학습에 관한 것입니다
다니엘 Gratzer

2
CLOS를 보는 것이 합리적 일 수도 있습니다. 많은 언어 / 프레임 워크가 다중 방법을 제공한다고 생각하지 않습니다.
Giorgio

2
@jozefg : 맞습니다. Alan Kay는 "실제로"객체 지향 "이라는 용어를 만들었고 C ++을 염두에두고 있지 않다고 말할 수 있습니다."
Javier

1
@Giorgio 실제로 Dylan은 약간 더 간단한 버전의 CLOS를 제공 할 수 있습니다 ( 멀티 메소드가 실행될 를 지정할 방법 은 없지만 접근이 훨씬 더 간단합니다)
Daniel Gratzer

4

객체 지향 프로그래밍은 프로그래밍 언어를 구조화하여 낮은 결합, 정보 숨기기 (일명 캡슐화), 해당 데이터에서 함께 작동하는 번들링 데이터 및 메소드, 코드 재사용을 촉진하는 방법에 대한 아이디어입니다. 많은 언어들이 이러한 아이디어를 받아 들여서 객체 지향에 접근하는 방식에 대해 언어마다 차이가 있습니다. 예를 들어, Java는 한 클래스 만 1 개의 클래스를 확장 할 수 있습니다. 그러나 Python과 C ++를 사용하면 여러 클래스를 확장 할 수 있습니다. Java에는 한계가있는 구체적인 이유가 있습니다. C ++에서 문제를 해결하기위한 제한 사항이지만 Smalltalk는 단일 기본 클래스 만 지원하기 때문입니다.

OO 언어는 두 가족으로 그룹화 할 수 있습니다. 언어의 스몰 토크 패밀리 (또는 클래스 기반 OOP)에는 C ++, Java, 스몰 토크, 루비, C #, 파이썬이 포함됩니다 (이 제품군에는 톤이 있습니다). 이들은 정적 및 동적 유형 언어가 혼합되어 있으며 일부 개념에서는 약간 다르지만 OOP에 대한 생각은 매우 유사합니다. 이것이 의미하는 바는 커플 링, 캡슐화, 데이터 및 메소드 바인딩, 코드 재사용 및 사용자가 제공하는 도구에 접근하는 방식입니다. 이 가족 내에서 많은 개념이 동일합니다.

다른 가족은 protoype 기반 OOP입니다. 이러한 언어는 OOP 구현에서 매우 다르게 보입니다. 아마도 가장 잘 알려진 예는 Javascript이지만 Javascript는 Scheme 및 Object LISP에서 이러한 아이디어를 복사했습니다. 이들은 덜 알려진 언어이며 일반적으로 동적으로 유형이 지정됩니다. 정적으로 유형이 지정된 프로토 타입 기반 언어는 생각할 수 없지만 언어가없는 것은 아닙니다. http://en.wikipedia.org/wiki/Prototype-based_programming 에서 읽을 수 있습니다 . 요점은 클래스 기반 언어와는 매우 다른 방식으로 OOP에 접근한다는 것입니다. 즉,이 두 제품군간에 개념을 이식 할 수 없다는 의미입니다. 한 가정에서 OO를 알고 있다고해서 그러한 아이디어를 다른 가정으로 쉽게 전환 할 수는 없습니다.

대부분의 프로그래밍 언어는 많은 아이디어의 개념을 혼합합니다. 파이썬과 루비는 OOP와 기능적 프로그래밍 아이디어를 그들의 언어로 통합합니다. 또한 프로토 타입 기반 OO와 클래스 기반 언어의 특정 확장을 혼합하여 훨씬 더 복잡 할 수 있습니다.


C ++을 Smalltalk 제품군에 포함시키지 않습니다. 스몰 토크는 Simula를 기반으로하며 Alan Kay 는 Simula-II의 대부분의 변경 사항을 일부러 무시했지만 C ++은이를 기반으로합니다. C #은 이상합니다. C ++ 사용자와 Pascal 디자이너가 Java와 비슷하게 설계했습니다.
Jörg W Mittag

1

OOP는 프로그래밍의 원칙입니다. 기본적으로 아이디어입니다. OOP의 구현은 프로그래밍 언어에 따라 다르지만 OOP의 기둥 (추상, 상속, 캡슐화 및 다형성)은 일반적으로 어떤 방식이나 형태로 존재합니다.

자바는 파이썬보다 시맨틱 스를 프로그래머에게 조금 더 어렵게 만든다.

예를 들어

자바 코드 : class Cat extends Animal {}

OOP 관점에서 수행하는 작업에 대해 다음보다 조금 더 명확합니다.

파이썬 코드 : class Cat(Animal):

물론 둘 다 Cat이 Animal에서 상속하는 클래스 계층 구조를 정의합니다. 그러나 OOP에서 시작한 프로그래머에게는 OOP 아이디어의 응용 프로그램과 의미가 프로그래머에게 철자하기 때문에 Java에서 조금 더 나아질 수 있다고 생각합니다.


1

OOP 개념을 배우는 가장 쉬운 언어가 무엇인지 명시 적으로 묻고 있습니다. 나는 대답이 분명하다고 생각합니다 : python .

이것이 왜 그런지 보여주기 위해 Java와 Python의 일반적인 초보자 프로그램을 살펴 보겠습니다. 간단하고 더 낮은 추측 게임을 만들어 봅시다.

자바

Java에서는 Game 클래스를 작성합니다.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

저는 숙련 된 프로그래머이며 어려움을 겪고 있습니다. 또한이 간단한 프로그램을 위해 예비 학생에게 설명 할 내용을 살펴보십시오.

  • 정적 메소드
  • 공개 (비공개) 항상 필드를 비공개로 표시해야합니다.
  • this. 변수가 다른 사람에 의해 가려 질 때 변수를 나타내는 표기법
  • 생성자는 메서드와 비슷하지만 메서드가 아닙니다.
  • System.outoutputStream입니다. 그리고 예, 그것은 필드이지만 static필드입니다.
  • 하나의 문장 만 있으면 중괄호를 생략 할 수 있습니다.
  • String[]배열입니다. 그것은 특별한 유형의 객체이지만 다시는 실제로는 아닙니다.
  • int기본 유형입니다. 특별하다.
  • 많은 프레임 워크 방법이 필요합니다

파이썬

파이썬은 많은 '순수하다'. 기본 유형이 없습니다. 생성자가 존재하지 않으며 초기화시 호출되는 특수 메소드 만 있습니다.

가있는 것처럼 콘솔과 상호 작용할 필요가 없습니다 REPL. 당신은 단순히 g.guess(35)문자열을 사용 하고 반환하는 게임을 할 수 있습니다 .

이를 통해 언어를보다 쉽게 ​​배우고 기본 OOP 개념을 파악할 수 있습니다.


0

OOP의 핵심 아이디어는 클래스와 변수를 함께 캡슐화 (번들거나 숨기는 것을 의미 함)하는 것입니다 (파이썬은 절대적으로 지원합니다). 명사를 중심으로 코드를 디자인하는 것입니다. 그런 다음 거기에서 계속됩니다.

구현 차이 (예 : python은 Java와 같은 가시성을 지원하지 않음)와 구문 차이 (Javascript에서는 직접 메소드를 상속해야 함)가 있지만 기본 디자인은 동일하게 유지됩니다.

Java와 같은 언어로 OOP를 배우는 것이 더 쉽다고 생각합니다. 왜냐하면 언어에는 언어가 필요하고 커뮤니티는 파이썬 커뮤니티보다 불리하지 않기 때문입니다.

그러나 OOP 디자인 및 관행에 대한 글이 많이 있으며, 그것을 읽는 것은 노력이 낭비되지 않습니다. 파이썬 (많은)을 쓸 때도 많은 객체를 쓰고 타사 라이브러리의 많은 객체를 사용합니다.


코드 아이디어는 메시지 전달입니다. 또한 소스가 없습니다.
사용자

1
OOP는 클래스에 관한 것이 아닙니다 .
Jörg W Mittag

1
@User Alan Kay의 원래 아이디어는 메시징에 관한 것이었지만 그 이후로 OO의 관행은 명사 또는 객체 클래스에 의해 디자인으로 발전했습니다. 예를 들어, Dr. Kay는 Java가 늦은 바인딩을 지원하지 않기 때문에 Java가 Object Oriented가 아니라고 평가했습니다. @ Jorg lol ya ya
Rob

0

언어로 OOP를 배우면이 언어로 생각하기 시작합니다. 이 언어는 수행 할 수있는 생각과 OOP에 맛을 추가하는 방법에 영향을줍니다.

  • 가비지 콜렉션이 있어야합니까?
  • 정수에 메소드를 추가 할 수 있습니까?
  • 수업이나 프로토 타입을 사용합니까?
  • 물체는 어떻게 자신에 반영됩니까?

어떤 사람들은 수업이 없으면 OOP를 할 수 없습니다. 일부는 프로세스를 통해 객체를 죽여야합니다.

OOP의 핵심과 그것에 대한 독창적 인 아이디어가 있습니다. Smalltalk, Self, Simula, LISP, Newspeak를 살펴볼 수도 있습니다. 또한 데이터 흐름 언어 bash, APL, J. Logical ones Prolog와 같은 비 OOP 언어 유형을 살펴보십시오. 하스켈 (유형 클래스). 그들은 모두 다른 생각을 가르쳐 줄 것이고

  • OOP는 명령형 언어가 아닙니다
  • OOP는 수업에 관한 것이 아닙니다

그리고 결국 당신은 OOP가 좋은 것을 볼 수 있습니다. 적어도 그것에 대해 또 다른 아이디어가 있습니다. Alan Kay의 대화를 찾는 것이 좋습니다 .


당신이 언어를 보지 않으면이 게시물은 쓸모가 없습니다.

여기에서 볼 수 있듯이 : OOP가 무엇인지 동의 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.